This commit was generated by cvs2svn to compensate for changes in r25, which
authortomo <tomo>
Mon, 17 May 1999 09:41:34 +0000 (09:41 +0000)
committertomo <tomo>
Mon, 17 May 1999 09:41:34 +0000 (09:41 +0000)
included commits to RCS files with non-trunk default branches.

105 files changed:
CHANGES-beta
ChangeLog
Makefile.in [new file with mode: 0644]
configure
configure.in
etc/sample.emacs [new file with mode: 0644]
lib-src/install-sid [new file with mode: 0755]
lib-src/pstogif [new file with mode: 0755]
lib-src/run.c [new file with mode: 0644]
lib-src/send-pr [new file with mode: 0755]
lib-src/tm-au [new file with mode: 0755]
lib-src/tm-file [new file with mode: 0755]
lib-src/tm-html [new file with mode: 0755]
lib-src/tm-image [new file with mode: 0755]
lib-src/tm-mpeg [new file with mode: 0755]
lib-src/tm-plain [new file with mode: 0755]
lib-src/tm-ps [new file with mode: 0755]
lib-src/tmdecode [new file with mode: 0755]
lib-src/update-elc.sh [new file with mode: 0644]
lisp/ChangeLog
lisp/auto-autoloads.el
lisp/bytecomp.el
lisp/custom-load.el
lisp/files.el
lisp/finder-inf.el [new file with mode: 0644]
lisp/mule/mule-files.el [new file with mode: 0644]
lisp/package-get-base.el [new file with mode: 0644]
lisp/setup-paths.el
lisp/startup.el
lisp/update-elc.el
lisp/winnt.el [new file with mode: 0644]
lock/.precious [new file with mode: 0644]
lwlib/config.h [new file with mode: 0644]
man/info-stnd.texi [new file with mode: 0644]
man/internals/Makefile [new file with mode: 0644]
man/internals/index.perm [new file with mode: 0644]
man/internals/index.unperm [new file with mode: 0644]
man/lispref/Makefile [new file with mode: 0644]
man/lispref/index.perm [new file with mode: 0644]
man/lispref/index.unperm [new file with mode: 0644]
man/lispref/permute-index [new file with mode: 0755]
man/new-users-guide/Makefile [new file with mode: 0644]
man/xemacs/Makefile [new file with mode: 0644]
modules/Makefile.in [new file with mode: 0644]
modules/aclocal.m4 [new file with mode: 0644]
modules/base64/Makefile.in [new file with mode: 0644]
modules/configure.in [new file with mode: 0644]
modules/example/Makefile.in [new file with mode: 0644]
modules/example/purified.c [new file with mode: 0644]
modules/ldap/Makefile.in [new file with mode: 0644]
modules/ldap/configure.in [new file with mode: 0644]
modules/zlib/Makefile.in [new file with mode: 0644]
nt/Makefile.cygwin [new file with mode: 0644]
nt/Todo [new file with mode: 0644]
nt/inc/arpa/inet.h [new file with mode: 0644]
nt/inc/netdb.h [new file with mode: 0644]
nt/inc/netinet/in.h [new file with mode: 0644]
nt/inc/pwd.h [new file with mode: 0644]
nt/inc/sys/dir.h [new file with mode: 0644]
nt/inc/sys/file.h [new file with mode: 0644]
nt/inc/sys/ioctl.h [new file with mode: 0644]
nt/inc/sys/param.h [new file with mode: 0644]
nt/inc/sys/socket.h [new file with mode: 0644]
nt/inc/sys/time.h [new file with mode: 0644]
nt/inc/unistd.h [new file with mode: 0644]
nt/puresize-adjust.h [new file with mode: 0644]
nt/runemacs.c [new file with mode: 0644]
src/ChangeLog
src/acldef.h [new file with mode: 0644]
src/buffer.c
src/buffer.h
src/bufslots.h
src/casefiddle.c
src/chpdef.h [new file with mode: 0644]
src/config.h.in
src/console-x.h
src/dbxrc [new file with mode: 0644]
src/dll.c [new file with mode: 0644]
src/emacs.c
src/faces.c
src/fns.c
src/gdbinit [new file with mode: 0644]
src/glyphs-eimage.c
src/glyphs.c
src/input-method-xfs.c [new file with mode: 0644]
src/insdel.c
src/lisp.h
src/lread.c
src/mule-canna.c
src/mule-coding.c [new file with mode: 0644]
src/mule-coding.h [new file with mode: 0644]
src/mule-mcpath.c [new file with mode: 0644]
src/mule-mcpath.h [new file with mode: 0644]
src/objects-msw.c
src/pure.c [new file with mode: 0644]
src/puresize.h [new file with mode: 0644]
src/redisplay-x.c
src/redisplay.c
src/regex.c
src/s/msdos.h [new file with mode: 0644]
src/s/windows95.h [new file with mode: 0644]
src/xselect.c [new file with mode: 0644]
tests/basic-lisp.el [new file with mode: 0644]
tests/database.el [new file with mode: 0644]
tests/test-emacs.el [new file with mode: 0644]

index 9a96988..530bc55 100644 (file)
@@ -1,16 +1,4 @@
                                                        -*- indented-text -*-
-to 21.2 beta2 "Aether"
--- Synched with 21.0-pre14 "Poitou"
--- isearch improvements from Hrvoje Niksic
--- bytecompiler fix from Martin Buccholz
--- shadow.el speedup from Martin Buchholz
--- clash detection update from Jan Vroonhof
--- Indirect buffers from Hrvoje Niksic
--- ~user completion cleanup from Greg Klanderman
--- New face property from Didier Verna
--- ~user completion and fixes from Greg Klanderman
--- casefiddle.c speedup from Martin Buchholz
-
 to 21.2 beta1 "Aeolus"
 -- Synch with 21.0-pre6
 -- Removal of ancient obsolete symbols courtesy of Altrasoft
index a92e140..2671250 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,86 +1,3 @@
-1998-09-29  SL Baur  <steve@altair.xemacs.org>
-
-       * XEmacs 21.2-beta2 is released.
-
-1998-09-09  Gunnar Evermann  <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
-       * lwlib/xlwmenu.c:
-       * lwlib/xlwscrollbar: fix for Motif >=2.0
-       Patch provided by Glenn Barry <gtb@eng.sun.com>
-
-       * PROBLEMS: XEmacs 21.0 now works on HP-UX 11.0
-
-1998-09-02  Andy Piper  <andyp@parallax.co.uk>
-
-       * configure.in: check for cygwin32/version.h.
-
-1998-08-31  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * PROBLEMS: Added AIX 4.3 note.
-
-       * configure.in: Better detection of AIX 4.3.
-       AIX xlc can do -g and -Ox at the same time.
-
-1998-09-05  SL Baur  <steve@altair.xemacs.org>
-
-       * etc/check_cygwin_setup.sh: grammar fix.
-
-1998-09-02  Andy Piper  <andyp@parallax.co.uk>
-
-       * etc/check_cygwin_setup.sh: fix a couple of buglets.
-
-1998-08-23  Adrian Aichner  <aichner@ecf.teradyne.com>
-
-       * etc/sample.emacs: Enable sound support on mswindows devices.
-
-1998-08-17  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * configure.in: Alter configure so that it checks for mismatched PNG
-       header/libs, screams a little louder on old/mismatched library
-       conditions for both PNG and XPM, stop screaming if png is not found and
-       no window-system is selected, and fixed a bug in the XPM checking.
-
-1998-08-06  Adrian Aichner  <aichner@ecf.teradyne.com>
-
-       * etc/TUTORIAL.de: Fixing typos and grammatical errors.  Fixing
-       inconsistent usage of RET, <Return>, and <return> (only using
-       <Return> now).  Changing TUTORIAL to TUTORIAL.de throughout
-       itself.  Adding english equivalent to german translation of all
-       concepts used in TUTORIAL.de.
-
-1998-08-07  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * configure.usage (--without-gif): Modify text to reflect status
-       of GIF support
-
-1998-08-04  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * configure.in: add back in the support for the in-core GIF
-       code, change the required PNG library version to 1.0.2, and add
-       a warning if PNG not found, since PNG images are now distributed
-       as part of the core.  Also minor wording changes in things reported
-       to the user.
-
-1998-07-28  Kai Haberzettl  <khaberz@synnet.de>
-
-       * BETA: Update mailing-list address for build-reports
-
-1998-08-01  SL Baur  <steve@altair.xemacs.org>
-
-       * Makefile.in (TAGS tags): Add variable `tagslisp' so a TAGS file
-       can built that includes package lisp.
-
-1998-07-23  Martin Buchholz  <martin@xemacs.org>
-
-       * configure.in:
-       - support multiple flavors of alpha, (XEmacs treats them identically)
-       - Fix AC_TRY_RUN so that actions have access to $?
-       - Identify DEC C compilers. Add default optimization CFLAGS and
-         always use -std.
-       - Use an extensible method for adding support for future compilers.
-       - Have SunPro C use that same extensible method.
-       - Make sol2 always use `-R', Linux and DEC OSF always use `-rpath'
-
 1998-07-19  SL Baur  <steve@altair.xemacs.org>
 
        * XEmacs 21.2-beta1 is released.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..3a59498
--- /dev/null
@@ -0,0 +1,631 @@
+## DIST: This is the distribution Makefile for XEmacs.  configure can
+## DIST: make most of the changes to this file you might want, so try
+## DIST: that first.
+
+## This file is part of XEmacs.
+
+## XEmacs 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.
+
+## XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+## the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+## Boston, MA 02111-1307, USA.
+
+## make all    to compile and build XEmacs.
+## make install        to build and install it.
+## make install-only   to install after a previous complete build
+## 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.
+
+@SET_MAKE@
+RECURSIVE_MAKE=@RECURSIVE_MAKE@
+SHELL = /bin/sh
+LANG = C
+RM = rm -f
+pwd = /bin/pwd
+
+## ==================== Things `configure' Might Edit ====================
+
+CC=@CC@
+CPP=@CPP@
+LN_S=@LN_S@
+CFLAGS=@CFLAGS@
+CPPFLAGS=@CPPFLAGS@
+LDFLAGS=@LDFLAGS@
+
+## These help us choose version- and architecture-specific directories
+## to install files in.
+
+## This should be the number of the XEmacs version we're building,
+## like `19.12' or `19.13'.
+version=@version@
+
+## This should be the name of the configuration we're building XEmacs
+## for, like `mips-dec-ultrix' or `sparc-sun-sunos'.
+configuration=@configuration@
+
+## This will be the name of the generated binary and is set automatically
+## by configure.
+PROGNAME=@PROGNAME@
+
+## ==================== Where To Install Things ====================
+
+## The default location for installation.  Everything is placed in
+## subdirectories of this directory.  The default values for many of
+## the variables below are expressed in terms of this one, so you may
+## not need to change them.  This defaults to /usr/local.
+prefix=@prefix@
+
+## Like `prefix', but used for architecture-specific files.
+exec_prefix=@exec_prefix@
+
+## Where to install XEmacs and other binaries that people will want to
+## run directly (like etags).
+bindir=@bindir@
+
+## Where to install architecture-independent data files.
+## ${lispdir} and ${etcdir} are subdirectories of this.
+datadir=@datadir@
+
+## Where to find XEmacs packages.
+pkgdir=@pkgdir@
+
+## Where to install and expect the files that XEmacs modifies as it runs.
+## These files are all architecture-independent. Right now, the
+## only such data is the locking directory;
+## ${lockdir} is a subdirectory of this.
+statedir=@statedir@
+
+## Where to install and expect executable files to be run by XEmacs
+## rather than directly by users, and other architecture-dependent data
+## ${archlibdir} is a subdirectory of this.
+libdir=@libdir@
+
+## Where to install XEmacs's man pages, and what extension they should have.
+mandir=@mandir@
+manext=.1
+
+## Where to install and expect the info files describing XEmacs.  In the
+## past, this defaulted to a subdirectory of ${prefix}/lib/xemacs, but
+## since there are now many packages documented with the texinfo
+## system, it is inappropriate to imply that it is part of XEmacs.
+infodir=@infodir@
+
+## Document me.
+## See callproc.c for code which references this.
+infopath=@infopath@
+
+## Where to find the source code.  The source code for XEmacs's C kernel is
+## expected to be in ${srcdir}/src, and the source code for XEmacs's
+## utility programs is expected to be in ${srcdir}/lib-src.  This is
+## set by the configure script's `--srcdir' option.
+srcdir=@srcdir@
+
+## Where the build is done.
+blddir=@blddir@
+
+## ==================== XEmacs-specific directories ====================
+
+## These variables hold the values XEmacs will actually use.  They are
+## based on the values of the standard Make variables above.
+
+## Where to install the lisp files distributed with
+## XEmacs.  This includes the XEmacs version, so that the
+## lisp files for different versions of XEmacs will install
+## themselves in separate directories.
+lispdir=@lispdir@
+
+## Directory XEmacs should search for lisp files specific
+## to this site (i.e. customizations), before consulting
+## ${lispdir}.
+sitelispdir=@sitelispdir@
+
+## Where XEmacs will search for its lisp files while
+## building.  This is only used during the process of
+## compiling XEmacs, to help XEmacs find its lisp files
+## before they've been installed in their final location.
+## It's usually identical to lispdir, except that the
+## entry for the directory containing the installed lisp
+## files has been replaced with ../lisp.  This should be a
+## colon-separated list of directories.
+buildlispdir=${srcdir}/lisp
+
+## Where to install the other architecture-independent
+## data files distributed with XEmacs (like the tutorial,
+## the cookie recipes and the Zippy database). This path
+## usually contains the XEmacs version number, so the data
+## files for multiple versions of XEmacs may be installed
+## at once.
+etcdir=@etcdir@
+
+## Where to create and expect the locking directory, where
+## the XEmacs locking code keeps track of which files are
+## currently being edited.
+lockdir=@lockdir@
+
+## Where to put executables to be run by XEmacs rather than
+## the user.  This path usually includes the XEmacs version
+## and configuration name, so that multiple configurations
+## for multiple versions of XEmacs may be installed at
+## once.
+archlibdir=@archlibdir@
+
+## ==================== Utility Programs for the Build ====================
+
+## Allow the user to specify the install program.
+INSTALL = @install_pp@ @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+## ============================= Targets ==============================
+
+## Subdirectories to make recursively.  `lisp' is not included
+## because the compiled lisp files are part of the distribution
+## and you cannot remake them without installing XEmacs first.
+MAKE_SUBDIR = @MAKE_SUBDIR@
+
+## Subdirectories that can be made recursively.
+SUBDIR = ${MAKE_SUBDIR} man
+
+## The makefiles of the directories in ${MAKE_SUBDIR}.
+SUBDIR_MAKEFILES = @SUBDIR_MAKEFILES@
+
+## Subdirectories to `make install-arch-dep' recursively
+INSTALL_ARCH_DEP_SUBDIR = @INSTALL_ARCH_DEP_SUBDIR@
+
+## Subdirectories to install, and where they'll go.
+## lib-src's makefile knows how to install it, so we don't do that here.
+## When installing the info files, we need to do special things to
+## avoid nuking an existing dir file, so we don't do that here;
+## instead, we have written out explicit code in the `install' targets.
+COPYDIR = ${srcdir}/etc ${srcdir}/lisp
+COPYDESTS = ${etcdir} ${lispdir}
+GENERATED_HEADERS = src/paths.h src/Emacs.ad.h src/puresize-adjust.h src/config.h lwlib/config.h src/sheap-adjust.h
+GENERATED_LISP = lisp/finder-inf.el
+
+all: ${PROGNAME} all-elc info
+
+${PROGNAME}:   ${GENERATED_HEADERS} ${MAKE_SUBDIR} ${GENERATED_LISP}
+
+## For performance and consistency, no built-in rules
+.SUFFIXES:
+
+.NO_PARALLEL:  ${GENERATED_HEADERS} ${MAKE_SUBDIR} dump-elcs
+.PHONY: ${SUBDIR} all beta all-elc all-elcs dump-elc dump-elcs autoloads finder
+
+## Convenience target for XEmacs beta testers
+beta: clean all-elc finder
+
+## Convenience target for XEmacs maintainers
+## This would run `make-xemacsdist' if I were really confident that everything
+## was turnkey.
+dist: all-elc info
+
+## Convenience target for XEmacs maintainers
+## Updates some rarely generated files:
+## - configure from configure.in
+## - config.values.in from configure
+## - src/depend from src/*.[ch]
+.PHONY: config configure depend
+config: configure depend
+configure: ${srcdir}/configure
+${srcdir}/configure: ${srcdir}/configure.in
+       cd ${srcdir} && autoconf
+       cd ${srcdir} && /bin/sh lib-src/config.values.sh
+
+depend ${srcdir}/src/depend:
+       cd ${srcdir}/src && \
+               perl ./make-src-depend > depend.tmp && \
+               $(RM) depend && mv depend.tmp depend
+
+## Build XEmacs and recompile out-of-date and missing .elc files along
+## the way.
+all-elc all-elcs: lib-src lwlib dump-elcs src
+       MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-elc.sh
+
+## Sub-target for all-elc.
+dump-elc dump-elcs: ${GENERATED_HEADERS} FRC.dump-elcs
+       cd ./src && $(RECURSIVE_MAKE) dump-elcs
+
+autoloads: src
+       MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-autoloads.sh
+
+custom-loads:
+       MAKE='$(MAKE)' EMACS='./src/$(PROGNAME)' sh ${srcdir}/lib-src/update-custom.sh
+
+finder: src
+       @echo "Building finder database ..."
+       @(cd ./lisp; \
+               ${blddir}/src/${PROGNAME} -batch -vanilla \
+               -eval '(setq finder-compile-keywords-quiet t)' \
+               -l finder -f finder-compile-keywords )
+       @echo "Building finder database ...(done)"
+
+lisp/finder-inf.el:
+       @echo "Building finder database ..."
+       @(cd ./lisp; \
+               ${blddir}/src/${PROGNAME} -batch -vanilla \
+               -eval '(setq finder-compile-keywords-quiet t)' \
+               -l finder -f finder-compile-keywords )
+       @echo "Building finder database ...(done)"
+
+## We have to force the building of Emacs.ad.h as well in order to get it
+## updated correctly when VPATH is being used.  Since we use move-if-change,
+## it will only actually change if the user modified ${etcdir}/Emacs.ad.
+src/Emacs.ad.h: ${srcdir}/etc/Emacs.ad
+       @echo "Producing \`src/Emacs.ad.h' from \`etc/Emacs.ad'."
+       @$(RM) src/Emacs.ad.h
+       @(echo "/*      Do not edit this file!" ; \
+         echo "        Automatically generated from ${srcdir}/etc/Emacs.ad" ; \
+         echo " */" ; \
+         /bin/sh ${srcdir}/lib-src/ad2c ${srcdir}/etc/Emacs.ad ) > \
+         src/Emacs.ad.h
+
+src/puresize-adjust.h: ${srcdir}/src/puresize.h
+       @echo "Resetting \`src/puresize-adjust.h'."; \
+       (echo "/*       Do not edit this file!" ; \
+        echo "         Automatically generated by XEmacs */" ; \
+        echo "#define PURESIZE_ADJUSTMENT 0") > $@
+
+src/sheap-adjust.h:
+       @echo "Resetting \`src/sheap-adjust.h'."; \
+       (echo "/*       Do not edit this file!" ; \
+        echo "         Automatically generated by XEmacs */" ; \
+        echo "#define SHEAP_ADJUSTMENT 0") > $@
+
+src: @SRC_SUBDIR_DEPS@ FRC.src
+pkg-src/tree-x: pkg-src/FRC.tree-x
+lib-src: FRC.lib-src
+lwlib: FRC.lwlib
+dynodump: FRC.dynodump
+FRC.src FRC.lib-src FRC.lwlib FRC.dynodump pkg-src/FRC.tree-x:
+FRC.lisp.finder-inf.el:
+
+${SUBDIR}: ${SUBDIR_MAKEFILES} ${GENERATED_HEADERS} FRC
+       cd ./$@ && $(RECURSIVE_MAKE) all
+
+Makefile: ${srcdir}/Makefile.in config.status
+       ./config.status
+
+src/Makefile: ${srcdir}/src/Makefile.in.in ${srcdir}/src/depend config.status
+       ./config.status
+
+lib-src/Makefile: ${srcdir}/lib-src/Makefile.in.in config.status
+       ./config.status
+
+lwlib/Makefile: ${srcdir}/lwlib/Makefile.in.in config.status
+       ./config.status
+
+pkg-src/tree-x/Makefile: ${srcdir}/pkg-src/tree-x/Makefile.in.in config.status
+       ./config.status
+
+src/config.h: ${srcdir}/src/config.h.in
+       ./config.status && touch $@
+
+src/paths.h: ${srcdir}/src/paths.h.in
+       ./config.status && touch $@
+
+lwlib/config.h: ${srcdir}/lwlib/config.h.in
+       ./config.status && touch $@
+
+## ==================== Installation ====================
+
+## If we let lib-src do its own installation, that means we
+## don't have to duplicate the list of utilities to install in
+## this Makefile as well.
+
+## On AIX, use tar xBf.
+## On Xenix, use tar xpf.
+
+.PHONY: install-only install install-arch-dep install-arch-indep gzip.el mkdir
+.PHONY: check-features
+
+## We delete each directory in ${COPYDESTS} before we copy into it;
+## that way, we can reinstall over directories that have been put in
+## place with their files read-only (perhaps because they are checked
+## into RCS).  In order to make this safe, we make sure that the
+## source exists and is distinct from the destination.
+
+## FSF doesn't depend on `all', but rather on ${MAKE_SUBDIR}, so that
+## they "won't ever modify src/paths.h".  But that means you can't do
+## 'make install' right off the bat because src/paths.h won't exist.
+## And, in XEmacs case, src/Emacs.ad.h won't exist either.  I also
+## don't see the point in avoiding modifying paths.h.  It creates an
+## inconsistency in the build process.  So we go ahead and depend on
+## all.  --cet
+
+check-features: all
+       ${blddir}/src/${PROGNAME} -batch -l check-features.el
+
+install-only: ${MAKE_SUBDIR} check-features install-arch-dep install-arch-indep
+
+install: all check-features install-arch-dep install-arch-indep
+
+install-arch-dep: mkdir
+       for subdir in ${INSTALL_ARCH_DEP_SUBDIR}; do \
+       (cd ./$${subdir} && $(RECURSIVE_MAKE) install prefix=${prefix} \
+           exec_prefix=${exec_prefix} bindir=${bindir} libdir=${libdir} \
+           archlibdir=${archlibdir}) ; done
+       if test "`(cd ${archlibdir} && $(pwd))`" != \
+               "`(cd ./lib-src && $(pwd))`"; then \
+          if test -f ../Installation; then \
+               ${INSTALL_DATA} ../Installation ${archlibdir}/Installation; \
+          fi; \
+          for f in DOC config.values; do \
+               ${INSTALL_DATA} lib-src/$${f} ${archlibdir}/$${f}; \
+          done ; \
+          for subdir in `find ${archlibdir} -type d ! -name RCS ! -name SCCS ! -name CVS -print` ; \
+            do (cd $${subdir} && $(RM) -r RCS CVS SCCS \#* *~) ; done ; \
+       else true; fi
+       ${INSTALL_PROGRAM} src/${PROGNAME} ${bindir}/${PROGNAME}-${version}
+       -chmod 0755 ${bindir}/${PROGNAME}-${version}
+       cd ${bindir} && $(RM) ./${PROGNAME} && ${LN_S} ${PROGNAME}-${version} ./${PROGNAME}
+       if test "${prefix}" != "${exec_prefix}"; then \
+         for dir in \
+               lib/${PROGNAME} \
+               lib/${PROGNAME}-${version}/etc \
+               lib/${PROGNAME}-${version}/info \
+               lib/${PROGNAME}-${version}/lisp; do \
+           if test ! -d ${exec_prefix}/$${dir}; then \
+             $(LN_S) ${prefix}/$${dir} ${exec_prefix}/$${dir}; fi; \
+         done; \
+       fi
+
+install-arch-indep: mkdir info
+       -@set ${COPYDESTS} ; \
+        for dir in ${COPYDIR} ; do \
+          if test "`(cd $$1 && $(pwd))`" != \
+                  "`(cd $${dir} && $(pwd))`"; then \
+            : do nothing - echo "rm -rf $$1" ; \
+          fi ; \
+          shift ; \
+        done
+       -set ${COPYDESTS} ; \
+        for dir in ${COPYDESTS} ; do \
+          if test ! -d $${dir} ; then mkdir $${dir} ; fi ; \
+        done ; \
+        for dir in ${COPYDIR} ; do \
+          dest=$$1 ; shift ; \
+          test -d $${dir} \
+            -a "`(cd $${dir} && $(pwd))`" != \
+               "`(cd $${dest} && $(pwd))`" \
+          && (echo "Copying $${dir}..." ; \
+              (cd $${dir} && tar -cf - . ) | \
+               (cd $${dest} && umask 022 && tar -xf - );\
+              chmod 0755 $${dest}; \
+              for subdir in `find $${dest} -type d ! -name RCS ! -name SCCS ! -name CVS -print` ; do \
+                (cd $${subdir} && $(RM) -r RCS CVS SCCS \#* *~) ; \
+              done) ; \
+        done
+       if test "`(cd ${srcdir}/info && $(pwd))`" != \
+               "`(cd ${infodir} && $(pwd))`" && cd ${srcdir}/info; then \
+         if test ! -f ${infodir}/dir -a -f dir ; then \
+           ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir ; \
+         fi ; \
+         for file in *.info* ; do \
+           ${INSTALL_DATA} $${file} ${infodir}/$${file} ; \
+           chmod 0644 ${infodir}/$${file}; \
+         done ; \
+       fi
+       ## Note it's `xemacs' not ${PROGNAME}
+       cd ${srcdir}/etc && \
+         for page in xemacs etags ctags gnuserv gnuclient gnuattach gnudoit; do \
+           ${INSTALL_DATA} ${srcdir}/etc/$${page}.1 ${mandir}/$${page}${manext} ; \
+           chmod 0644 ${mandir}/$${page}${manext} ; \
+         done
+       @echo "If you would like to save approximately 2M of disk space, do"
+       @echo "make gzip-el"
+       @echo "or you may run "
+       @echo ${srcdir}/lib-src/gzip-el.sh lispdir " from the command line."
+       @echo "Where lispdir is where the lisp files were installed, i.e.,"
+       @echo "${lispdir}"
+
+gzip-el:
+       ${srcdir}/lib-src/gzip-el.sh ${lispdir}
+
+MAKEPATH=./lib-src/make-path
+## Build all the directories to install XEmacs in.
+## Since we may be creating several layers of directories,
+## (e.g. /usr/local/lib/${PROGNAME}-20.5/sparc-sun-solaris2.6), we use
+## make-path instead of mkdir.  Not all mkdirs have the `-p' flag.
+mkdir: FRC.mkdir
+       ${MAKEPATH} ${COPYDESTS} ${lockdir} ${infodir} ${archlibdir} \
+         ${mandir} ${bindir} ${datadir} ${libdir} ${pkgdir}
+       -chmod 0777 ${lockdir}
+
+## Delete all the installed files that the `install' target would
+## create (but not the noninstalled files such as `make all' would
+## create).
+
+#### Don't delete the lisp and etc directories if they're in the source tree.
+#### This target has not been updated in sometime and until it is it
+#### would be extremely dangerous for anyone to use it.
+#uninstall:
+#      (cd ./lib-src;                                  \
+#       $(RECURSIVE_MAKE) uninstall                    \
+#          prefix=${prefix} exec_prefix=${exec_prefix} \
+#          bindir=${bindir} libdir=${libdir} archlibdir=${archlibdir})
+#      for dir in ${lispdir} ${etcdir} ; do            \
+#        case `(cd $${dir} ; $(pwd))` in                       \
+#          `(cd ${srcdir} ; $(pwd))`* ) ;;             \
+#          * ) $(RM) $${dir} ;;                        \
+#        esac ;                                        \
+#        case $${dir} in                               \
+#          ${datadir}/${PROGNAME}/${version}/* )               \
+#            $(RM) -r ${datadir}/${PROGNAME}/${version}        \
+#          ;;                                          \
+#        esac ;                                        \
+#      done
+#      cd ${infodir} && $(RM) cl* ${PROGNAME}* forms* info* vip*
+#      cd ${mandir} && $(RM) xemacs.1 etags.1 ctags.1 gnuserv.1
+#      cd ${bindir} && $(RM) ${PROGNAME}-${version} ${PROGNAME}
+
+
+## Some makes seem to remember that they've built something called FRC,
+## so you can only use a given FRC once per makefile.
+FRC FRC.src.paths.h FRC.mkdir FRC.dump-elcs FRC.info:
+FRC.mostlyclean FRC.clean FRC.distclean FRC.realclean FRC.tags:
+
+## ==================== Cleaning up and miscellanea ====================
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+
+## `mostlyclean'
+##      Like `clean', but may refrain from deleting a few files that people
+##      normally don't want to recompile.  For example, the `mostlyclean'
+##      target for GCC does not delete `libgcc.a', because recompiling it
+##      is rarely necessary and takes a lot of time.
+mostlyclean: FRC.mostlyclean
+       for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+
+## `clean'
+##      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.
+clean: FRC.clean
+       for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       $(RM) core
+
+## `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.
+top_distclean=\
+       $(RM) config.status config.log config-tmp-* build-install Installation ; \
+       for d in src lib-src lwlib dynodump ; do \
+         $(RM) $$d/Makefile $$d/Makefile.in ; \
+       done ; \
+       $(RM) core .sbinit Makefile lock/*; \
+       $(RM) lisp/finder-inf.el* Installation.el Installation.elc; \
+       $(RM) packages mule-packages site-lisp
+
+distclean: FRC.distclean
+       for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       -${top_distclean}
+
+## `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.
+
+##      One exception, however: `make realclean' should not delete
+##      `configure' even if `configure' can be remade using a rule in the
+##      Makefile.  More generally, `make realclean' should not delete
+##      anything that needs to exist in order to run `configure' and then
+##      begin to build the program.
+realclean: FRC.realclean
+       for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       -${top_distclean}
+       $(RM) TAGS
+
+## This doesn't actually appear in the coding standards, but Karl
+## says GCC supports it, and that's where the configuration part of
+## the coding standards seem to come from.  It's like distclean, but
+## it deletes backup and autosave files too.
+extraclean:
+       for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       $(RM) *~ \#*
+       -${top_distclean}
+
+## Unlocking and relocking.  The idea of these productions is to reduce
+## hassles when installing an incremental tar of XEmacs.  Do `make unlock'
+## before unlocking the file to take the write locks off all sources so
+## that tar xvof will overwrite them without fuss.  Then do `make relock'
+## afterward so that VC mode will know which files should be checked in
+## if you want to mung them.
+
+## Note: it's no disaster if these productions miss a file or two; tar
+## and VC will swiftly let you know if this happens, and it is easily
+## corrected.
+SOURCES = ChangeLog GETTING.GNU.SOFTWARE INSTALL Makefile.in PROBLEMS \
+       README build-install.in configure make-dist move-if-change
+
+.PHONY: unlock relock TAGS tags check dist info dvi mcs
+
+unlock:
+       chmod u+w $(SOURCES) cpp/*
+       -cd ./elisp && chmod u+w Makefile README *.texi
+       for d in src etc lib-src lisp; do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       cd ./lisp/term && chmod u+w README *.el
+       cd ./man && chmod u+w *texi* ChangeLog split-man
+       cd ./lwlib && chmod u+w *.[ch] Makefile.in.in
+
+relock:
+       chmod u-w $(SOURCES) cpp/*
+       -cd ./elisp && chmod u-w Makefile README *.texi
+       for d in src etc lib-src lisp; do (cd ./$$d && $(RECURSIVE_MAKE) $@); done
+       cd ./lisp/term && chmod u+w README *.el
+       cd ./man && chmod u+w *texi* ChangeLog split-man
+       cd ./lwlib && chmod u+w *.[ch] Makefile.in.in
+
+PRUNE_VC = -name SCCS -prune -o -name RCS -prune -o -name CVS -prune -o
+TAGS tags: FRC.tags
+       @echo "If you don't have a copy of etags around, then do 'make lib-src' first."
+       $(RM) ${srcdir}/TAGS
+       @PATH=`$(pwd)`/lib-src:$$PATH HOME=/-=-; export PATH HOME; \
+         echo "Using etags from `which etags`."
+       PATH=`$(pwd)`/lib-src:$$PATH ; export PATH; cd ${srcdir} && \
+       find src lwlib lib-src ${PRUNE_VC} -name '*.[ch]' -print | \
+         xargs etags -a -r '/[         ]*DEF\(VAR\|INE\)_[A-Z_]+[      ]*([    ]*"\([^"]+\)"/\2/'; \
+       find lisp ${PRUNE_VC} -name '*.el' -print | \
+         xargs etags -a -l none -r "/^(def\\(var\\|un\\|alias\\|const\\|macro\\)[      ]+'?\\([^       ]+\\)/\\2/"
+
+## We have automated tests!
+testdir = ${srcdir}/tests
+tests   = ${testdir}/basic-lisp.el ${testdir}/database.el
+
+check:
+       src/${PROGNAME} -batch -l ${testdir}/test-emacs.el -f batch-test-emacs ${tests}
+
+info: FRC.info
+       cd ${srcdir}/man && $(RECURSIVE_MAKE) $@
+
+dvi:
+       cd ${srcdir}/man && $(RECURSIVE_MAKE) $@
+
+## Fix up version information in executables (Solaris-only)
+mcs:
+       date=`LANG=C LC_ALL=C date -u '+%e %b %Y'`; \
+       ident="@(#)RELEASE VERSION XEmacs ${version} $${date}"; \
+       for f in `file lib-src/* src/${PROGNAME} | grep ELF | sed -e 's/:.*//'`; do \
+         mcs -da "$${ident} `echo $${f} | sed 's/.*\///'`" $${f}; \
+       done
index 9347c6c..0beba52 100755 (executable)
--- a/configure
+++ b/configure
@@ -999,7 +999,7 @@ machine='' opsys=''
 
 case "$canonical" in
   sparc-*-*        ) machine=sparc ;;
-  alpha*-*-*       ) machine=alpha ;;
+  alpha-*-*        ) machine=alpha ;;
   vax-*-*          ) machine=vax ;;
   mips-dec-*       ) machine=pmax ;;
   mips-sgi-*       ) machine=iris4d ;;
@@ -1034,9 +1034,9 @@ case "$canonical" in
     *-*-aix3.1*  ) opsys=aix3-1        ;;
   *-*-aix3.2.5 ) opsys=aix3-2-5        ;;
   *-*-aix3*    ) opsys=aix3-2  ;;
-  *-*-aix4.0*  ) opsys=aix4    ;;
+  *-*-aix4.2*  ) opsys=aix4-2  ;;
   *-*-aix4.1*  ) opsys=aix4-1  ;;
-  *-*-aix4*    ) opsys=aix4-2  ;;
+  *-*-aix4*    ) opsys=aix4    ;;
 
     *-gnu* )                   opsys=gnu    ;;
   *-*-bsd4.[01] )              opsys=bsd4-1 ;;
@@ -2081,35 +2081,31 @@ EOF
 }
 
 
-
+echo $ac_n "checking whether we are using SunPro C""... $ac_c" 1>&6
+echo "configure:2086: checking whether we are using SunPro C" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2087 "configure"
+#line 2088 "configure"
 #include "confdefs.h"
-int main () {
-#if defined __SUNPRO_C
-return 11;
-#elif defined __DECC
-return 12;
-#else
-return 0;
+
+int main() {
+#ifndef __SUNPRO_C
+#error Not a  SunPro compiler :-(
+******* ======= ******** &&&&&&&&
 #endif
-}
+
+; return 0; }
 EOF
-if { (eval echo configure:2099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
-then
-  :
+if { (eval echo configure:2099: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  __sunpro_c=yes
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  case "$conftest_rc" in
-  11) echo "You appear to be using the SunPro C compiler."; __SUNPRO_C=yes ;;
-  12) echo "You appear to be using the DEC C compiler."   ; __DECC=yes ;;
-esac
+  rm -rf conftest*
+  __sunpro_c=no
 fi
-rm -fr conftest*
-
+rm -f conftest*
+echo "$ac_t""$__sunpro_c" 1>&6
 
 
 
@@ -2281,24 +2277,20 @@ test "$extra_verbose" = "yes" && \
 
 test "$ordinary_link" = "no" -a -z "$libs_standard" && libs_standard="-lc"
 
-test "$__DECC" = "yes" && c_switch_site="$c_switch_site -std" &&  if test "$extra_verbose" = "yes"; then echo "    Appending \"-std\" to \$c_switch_site"; fi
-
 if test "$cflags_specified" = "no"; then
       if   test "$GCC" = "yes"; then
     CFLAGS="-g -O3 -Wall -Wno-switch"
                     test "$opsys $machine" = "cygwin32 intel386" && \
       CFLAGS="-g -O2 -Wall -Wno-switch"
-  elif test "$__SUNPRO_C" = "yes"; then
+  elif test "$__sunpro_c" = "yes"; then
     case "$opsys" in
       sol2    ) CFLAGS="-v -xO4" ;;
       sunos4* ) CFLAGS="-xO2";;
     esac
-  elif test "$__DECC" = "yes"; then
-    CFLAGS="-O3"
   elif test "$CC" = "xlc"; then
-    CFLAGS="-g -O3 -qstrict -qnoansialias -qlibansi -qinfo -qro -qmaxmem=20000"
-    else
-    CFLAGS="-O" ;  fi
+    CFLAGS="-O3 -qstrict -qnoansialias -qlibansi -qinfo -qro -qmaxmem=20000"
+  else
+        CFLAGS="-O" ;  fi
 fi
 
 
@@ -2365,7 +2357,7 @@ test -n "$unexec"          && extra_objs="$extra_objs $unexec" &&  if test "$ext
  fi
 
 echo $ac_n "checking for dynodump""... $ac_c" 1>&6
-echo "configure:2369: checking for dynodump" >&5
+echo "configure:2361: checking for dynodump" >&5
 if test "$unexec" != "unexsol2.o"; then
   echo "$ac_t""no" 1>&6
 else
@@ -2403,12 +2395,12 @@ if test "$unexec" = "unexaix.o"; then
   done
   
 echo $ac_n "checking for terminateAndUnload in -lC""... $ac_c" 1>&6
-echo "configure:2407: checking for terminateAndUnload in -lC" >&5
+echo "configure:2399: checking for terminateAndUnload in -lC" >&5
 ac_lib_var=`echo C'_'terminateAndUnload | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lC "
 cat > conftest.$ac_ext <<EOF
-#line 2412 "configure"
+#line 2404 "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
@@ -2419,7 +2411,7 @@ int main() {
 terminateAndUnload()
 ; return 0; }
 EOF
-if { (eval echo configure:2423: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -2496,22 +2488,18 @@ fi
 if   test "$dynamic" = "no"; then add_runtime_path=no
 elif test -n "$LD_RUN_PATH"; then add_runtime_path=yes
 else case "$opsys" in
-       sol2 | irix* | *bsd* | decosf* ) add_runtime_path=yes ;;
+       sol2 | irix* | *bsd* ) add_runtime_path=yes ;;
        * ) add_runtime_path=no ;;
      esac
 fi
 
 if test "$add_runtime_path" = "yes"; then
       echo $ac_n "checking "for runtime libraries flag"""... $ac_c" 1>&6
-echo "configure:2507: checking "for runtime libraries flag"" >&5
-  case "$opsys" in
-    sol2 ) dash_r = "-R" ;;
-    decosf* | linux* ) dash_r = "-rpath " ;;
-    *)
-      dash_r=""
-      for try_dash_r in "-R" "-R " "-rpath "; do
-        xe_check_libs="${try_dash_r}/no/such/file-or-directory"
-        
+echo "configure:2499: checking "for runtime libraries flag"" >&5
+  dash_r=""
+  for try_dash_r in "-R" "-R " "-rpath "; do
+    xe_check_libs="${try_dash_r}/no/such/file-or-directory"
+    
 if test "$GCC" = "yes"; then
   set x $xe_check_libs; shift; xe_check_libs=""
   while test -n "$1"; do
@@ -2524,15 +2512,15 @@ if test "$GCC" = "yes"; then
     shift
   done
 fi
-        cat > conftest.$ac_ext <<EOF
-#line 2529 "configure"
+    cat > conftest.$ac_ext <<EOF
+#line 2517 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   dash_r="$try_dash_r"
 else
@@ -2540,10 +2528,9 @@ else
   cat conftest.$ac_ext >&5
 fi
 rm -f conftest*
-        xe_check_libs=""
-        test -n "$dash_r" && break
-      done ;;
-  esac
+    xe_check_libs=""
+    test -n "$dash_r" && break
+  done
   if test -n "$dash_r";
     then echo "$ac_t"""\"${dash_r}\""" 1>&6
     else echo "$ac_t""NONE" 1>&6
@@ -2633,10 +2620,10 @@ else
 fi
 after_morecore_hook_exists=yes
 echo $ac_n "checking for malloc_get_state""... $ac_c" 1>&6
-echo "configure:2637: checking for malloc_get_state" >&5
+echo "configure:2624: checking for malloc_get_state" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 2640 "configure"
+#line 2627 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char malloc_get_state(); below.  */
@@ -2659,7 +2646,7 @@ malloc_get_state();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2650: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_malloc_get_state=yes"
 else
@@ -2679,10 +2666,10 @@ doug_lea_malloc=no
 fi
 
 echo $ac_n "checking for malloc_set_state""... $ac_c" 1>&6
-echo "configure:2683: checking for malloc_set_state" >&5
+echo "configure:2670: checking for malloc_set_state" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 2686 "configure"
+#line 2673 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char malloc_set_state(); below.  */
@@ -2705,7 +2692,7 @@ malloc_set_state();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2696: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_malloc_set_state=yes"
 else
@@ -2725,16 +2712,16 @@ doug_lea_malloc=no
 fi
 
 echo $ac_n "checking whether __after_morecore_hook exists""... $ac_c" 1>&6
-echo "configure:2729: checking whether __after_morecore_hook exists" >&5
+echo "configure:2716: checking whether __after_morecore_hook exists" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2731 "configure"
+#line 2718 "configure"
 #include "confdefs.h"
 extern void (* __after_morecore_hook)();
 int main() {
 __after_morecore_hook = 0
 ; return 0; }
 EOF
-if { (eval echo configure:2738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -2793,7 +2780,7 @@ fi
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2797: checking for $ac_word" >&5
+echo "configure:2784: checking for $ac_word" >&5
 
 if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
@@ -2846,7 +2833,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:2850: checking for a BSD compatible install" >&5
+echo "configure:2837: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 
   IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
@@ -2897,7 +2884,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2901: checking for $ac_word" >&5
+echo "configure:2888: checking for $ac_word" >&5
 
 if test -n "$YACC"; then
   ac_cv_prog_YACC="$YACC" # Let the user override the test.
@@ -2928,15 +2915,15 @@ for ac_hdr in mach/mach.h sys/stropts.h sys/timeb.h sys/time.h unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2932: checking for $ac_hdr" >&5
+echo "configure:2919: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 2935 "configure"
+#line 2922 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2940: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2965,19 +2952,19 @@ else
 fi
 done
 
-for ac_hdr in utime.h locale.h libgen.h fcntl.h ulimit.h cygwin32/version.h
+for ac_hdr in utime.h locale.h libgen.h fcntl.h ulimit.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2973: checking for $ac_hdr" >&5
+echo "configure:2960: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 2976 "configure"
+#line 2963 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2981: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2968: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3010,15 +2997,15 @@ for ac_hdr in linux/version.h kstat.h sys/pstat.h inttypes.h sys/un.h a.out.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3014: checking for $ac_hdr" >&5
+echo "configure:3001: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3017 "configure"
+#line 3004 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3022: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3009: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3048,10 +3035,10 @@ fi
 done
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:3052: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:3039: checking for sys/wait.h that is POSIX.1 compatible" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3055 "configure"
+#line 3042 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -3067,7 +3054,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:3071: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3058: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -3091,10 +3078,10 @@ EOF
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3095: checking for ANSI C header files" >&5
+echo "configure:3082: checking for ANSI C header files" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3098 "configure"
+#line 3085 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3102,7 +3089,7 @@ cat > conftest.$ac_ext <<EOF
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3106: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3119,7 +3106,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3123 "configure"
+#line 3110 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3137,7 +3124,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3141 "configure"
+#line 3128 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3155,7 +3142,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
 cat > conftest.$ac_ext <<EOF
-#line 3159 "configure"
+#line 3146 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3166,11 +3153,10 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3170: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   :
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -3192,10 +3178,10 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3196: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3182: checking whether time.h and sys/time.h may both be included" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3199 "configure"
+#line 3185 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -3204,7 +3190,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:3208: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3194: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -3228,10 +3214,10 @@ EOF
 fi
 
 echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6
-echo "configure:3232: checking for sys_siglist declaration in signal.h or unistd.h" >&5
+echo "configure:3218: checking for sys_siglist declaration in signal.h or unistd.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3235 "configure"
+#line 3221 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -3243,7 +3229,7 @@ int main() {
 char *msg = *(sys_siglist + 1);
 ; return 0; }
 EOF
-if { (eval echo configure:3247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3233: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_decl_sys_siglist=yes
 else
@@ -3268,9 +3254,9 @@ fi
 
 
 echo $ac_n "checking for struct utimbuf""... $ac_c" 1>&6
-echo "configure:3272: checking for struct utimbuf" >&5
+echo "configure:3258: checking for struct utimbuf" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3274 "configure"
+#line 3260 "configure"
 #include "confdefs.h"
 #ifdef TIME_WITH_SYS_TIME
 #include <sys/time.h>
@@ -3289,7 +3275,7 @@ int main() {
 static struct utimbuf x; x.actime = x.modtime;
 ; return 0; }
 EOF
-if { (eval echo configure:3293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3279: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
@@ -3309,10 +3295,10 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:3313: checking return type of signal handlers" >&5
+echo "configure:3299: checking return type of signal handlers" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3316 "configure"
+#line 3302 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -3329,7 +3315,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:3333: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3319: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -3351,10 +3337,10 @@ EOF
 
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3355: checking for size_t" >&5
+echo "configure:3341: checking for size_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3358 "configure"
+#line 3344 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3385,10 +3371,10 @@ EOF
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:3389: checking for pid_t" >&5
+echo "configure:3375: checking for pid_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3392 "configure"
+#line 3378 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3419,10 +3405,10 @@ EOF
 fi
 
 echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3423: checking for uid_t in sys/types.h" >&5
+echo "configure:3409: checking for uid_t in sys/types.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3426 "configure"
+#line 3412 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 EOF
@@ -3458,10 +3444,10 @@ EOF
 fi
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:3462: checking for mode_t" >&5
+echo "configure:3448: checking for mode_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3465 "configure"
+#line 3451 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3492,10 +3478,10 @@ EOF
 fi
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:3496: checking for off_t" >&5
+echo "configure:3482: checking for off_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3499 "configure"
+#line 3485 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3527,9 +3513,9 @@ fi
 
 
 echo $ac_n "checking for struct timeval""... $ac_c" 1>&6
-echo "configure:3531: checking for struct timeval" >&5
+echo "configure:3517: checking for struct timeval" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3533 "configure"
+#line 3519 "configure"
 #include "confdefs.h"
 #ifdef TIME_WITH_SYS_TIME
 #include <sys/time.h>
@@ -3545,7 +3531,7 @@ int main() {
 static struct timeval x; x.tv_sec = x.tv_usec;
 ; return 0; }
 EOF
-if { (eval echo configure:3549: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3535: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
   HAVE_TIMEVAL=yes
@@ -3567,10 +3553,10 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:3571: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:3557: checking whether struct tm is in sys/time.h or time.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3574 "configure"
+#line 3560 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <time.h>
@@ -3578,7 +3564,7 @@ int main() {
 struct tm *tp; tp->tm_sec;
 ; return 0; }
 EOF
-if { (eval echo configure:3582: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm=time.h
 else
@@ -3602,10 +3588,10 @@ EOF
 fi
 
 echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
-echo "configure:3606: checking for tm_zone in struct tm" >&5
+echo "configure:3592: checking for tm_zone in struct tm" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3609 "configure"
+#line 3595 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_cv_struct_tm>
@@ -3613,7 +3599,7 @@ int main() {
 struct tm tm; tm.tm_zone;
 ; return 0; }
 EOF
-if { (eval echo configure:3617: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3603: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm_zone=yes
 else
@@ -3636,10 +3622,10 @@ EOF
 
 else
   echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:3640: checking for tzname" >&5
+echo "configure:3626: checking for tzname" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3643 "configure"
+#line 3629 "configure"
 #include "confdefs.h"
 #include <time.h>
 #ifndef tzname /* For SGI.  */
@@ -3649,7 +3635,7 @@ int main() {
 atoi(*tzname);
 ; return 0; }
 EOF
-if { (eval echo configure:3653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3639: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_var_tzname=yes
 else
@@ -3675,10 +3661,10 @@ fi
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3679: checking for working const" >&5
+echo "configure:3665: checking for working const" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3682 "configure"
+#line 3668 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -3727,7 +3713,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3717: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3752,7 +3738,7 @@ fi
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:3756: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:3742: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 
 cat > conftestmake <<\EOF
@@ -3777,12 +3763,12 @@ fi
 
 
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:3781: checking whether byte ordering is bigendian" >&5
+echo "configure:3767: checking whether byte ordering is bigendian" >&5
 
 ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat > conftest.$ac_ext <<EOF
-#line 3786 "configure"
+#line 3772 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -3793,11 +3779,11 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:3797: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3783: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat > conftest.$ac_ext <<EOF
-#line 3801 "configure"
+#line 3787 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -3808,7 +3794,7 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:3812: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3798: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -3825,7 +3811,7 @@ fi
 rm -f conftest*
 if test $ac_cv_c_bigendian = unknown; then
 cat > conftest.$ac_ext <<EOF
-#line 3829 "configure"
+#line 3815 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -3838,11 +3824,10 @@ main () {
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:3842: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3828: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_c_bigendian=no
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -3865,10 +3850,10 @@ fi
 
 
 echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:3869: checking size of short" >&5
+echo "configure:3854: checking size of short" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3872 "configure"
+#line 3857 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3879,11 +3864,10 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_sizeof_short=`cat conftestval`
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -3907,10 +3891,10 @@ if test "$ac_cv_sizeof_short" = 0; then
   exit 1
 fi
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:3911: checking size of int" >&5
+echo "configure:3895: checking size of int" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3914 "configure"
+#line 3898 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3921,11 +3905,10 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -3943,10 +3926,10 @@ EOF
 
 
 echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:3947: checking size of long" >&5
+echo "configure:3930: checking size of long" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3950 "configure"
+#line 3933 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3957,11 +3940,10 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_sizeof_long=`cat conftestval`
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -3979,10 +3961,10 @@ EOF
 
 
 echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:3983: checking size of long long" >&5
+echo "configure:3965: checking size of long long" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3986 "configure"
+#line 3968 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3993,11 +3975,10 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_sizeof_long_long=`cat conftestval`
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -4015,10 +3996,10 @@ EOF
 
 
 echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:4019: checking size of void *" >&5
+echo "configure:4000: checking size of void *" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4022 "configure"
+#line 4003 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4029,11 +4010,10 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4014: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_sizeof_void_p=`cat conftestval`
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -4052,7 +4032,7 @@ EOF
 
 
 echo $ac_n "checking for long file names""... $ac_c" 1>&6
-echo "configure:4056: checking for long file names" >&5
+echo "configure:4036: checking for long file names" >&5
 
 ac_cv_sys_long_file_names=yes
 # Test for long file names in all the places we know might matter:
@@ -4099,12 +4079,12 @@ fi
 
 
 echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
-echo "configure:4103: checking for sin in -lm" >&5
+echo "configure:4083: checking for sin in -lm" >&5
 ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lm "
 cat > conftest.$ac_ext <<EOF
-#line 4108 "configure"
+#line 4088 "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
@@ -4115,7 +4095,7 @@ int main() {
 sin()
 ; return 0; }
 EOF
-if { (eval echo configure:4119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4157,14 +4137,14 @@ EOF
 
 
 cat > conftest.$ac_ext <<EOF
-#line 4161 "configure"
+#line 4141 "configure"
 #include "confdefs.h"
 #include <math.h>
 int main() {
 return atanh(1.0) + asinh(1.0) + acosh(1.0); 
 ; return 0; }
 EOF
-if { (eval echo configure:4168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_INVERSE_HYPERBOLIC
@@ -4181,7 +4161,7 @@ fi
 rm -f conftest*
 
 echo "checking type of mail spool file locking" 1>&6
-echo "configure:4185: checking type of mail spool file locking" >&5
+echo "configure:4165: checking type of mail spool file locking" >&5
 test -z "$mail_locking" -a "$mail_use_flock" = "yes" && mail_locking=flock
 test -z "$mail_locking" -a "$mail_use_lockf" = "yes" && mail_locking=lockf
 if   test "$mail_locking" = "lockf"; then { test "$extra_verbose" = "yes" && cat << \EOF
@@ -4205,12 +4185,12 @@ fi
 
 
 echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6
-echo "configure:4209: checking for kstat_open in -lkstat" >&5
+echo "configure:4189: checking for kstat_open in -lkstat" >&5
 ac_lib_var=`echo kstat'_'kstat_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkstat "
 cat > conftest.$ac_ext <<EOF
-#line 4214 "configure"
+#line 4194 "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
@@ -4221,7 +4201,7 @@ int main() {
 kstat_open()
 ; return 0; }
 EOF
-if { (eval echo configure:4225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4255,12 +4235,12 @@ fi
 
 
 echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6
-echo "configure:4259: checking for kvm_read in -lkvm" >&5
+echo "configure:4239: checking for kvm_read in -lkvm" >&5
 ac_lib_var=`echo kvm'_'kvm_read | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkvm "
 cat > conftest.$ac_ext <<EOF
-#line 4264 "configure"
+#line 4244 "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
@@ -4271,7 +4251,7 @@ int main() {
 kvm_read()
 ; return 0; }
 EOF
-if { (eval echo configure:4275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4306,12 +4286,12 @@ fi
 case "$opsys" in decosf*)
   
 echo $ac_n "checking for cma_open in -lpthreads""... $ac_c" 1>&6
-echo "configure:4310: checking for cma_open in -lpthreads" >&5
+echo "configure:4290: checking for cma_open in -lpthreads" >&5
 ac_lib_var=`echo pthreads'_'cma_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpthreads "
 cat > conftest.$ac_ext <<EOF
-#line 4315 "configure"
+#line 4295 "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
@@ -4322,7 +4302,7 @@ int main() {
 cma_open()
 ; return 0; }
 EOF
-if { (eval echo configure:4326: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4306: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4358,7 +4338,7 @@ fi
 esac
 
 echo $ac_n "checking whether the -xildoff compiler flag is required""... $ac_c" 1>&6
-echo "configure:4362: checking whether the -xildoff compiler flag is required" >&5
+echo "configure:4342: checking whether the -xildoff compiler flag is required" >&5
 if   ${CC-cc} '-###' -xildon  no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ; then
   if ${CC-cc} '-###' -xildoff no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ;
     then echo "$ac_t""no" 1>&6;
@@ -4369,7 +4349,7 @@ fi
 
 if test "$opsys" = "sol2" && test "$OS_RELEASE" -ge 56; then
   echo $ac_n "checking for \"-z ignore\" linker flag""... $ac_c" 1>&6
-echo "configure:4373: checking for \"-z ignore\" linker flag" >&5
+echo "configure:4353: checking for \"-z ignore\" linker flag" >&5
   case "`ld -h 2>&1`" in
     *-z\ ignore\|record* ) echo "$ac_t""yes" 1>&6
       ld_switch_site="-z ignore $ld_switch_site" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-z ignore\" to \$ld_switch_site"; fi ;;
@@ -4379,7 +4359,7 @@ fi
 
 
 echo "checking "for specified window system"" 1>&6
-echo "configure:4383: checking "for specified window system"" >&5
+echo "configure:4363: checking "for specified window system"" >&5
 
 if test "$with_x11" != "no"; then
     test "$x_includes $x_libraries" != "NONE NONE" && \
@@ -4412,7 +4392,7 @@ if test "$with_x11" != "no"; then
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:4416: checking for X" >&5
+echo "configure:4396: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -4472,12 +4452,12 @@ if test "$ac_x_includes" = NO; then
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 4476 "configure"
+#line 4456 "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:4481: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4461: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4546,14 +4526,14 @@ if test "$ac_x_libraries" = NO; then
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4550 "configure"
+#line 4530 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:4557: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -4662,17 +4642,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:4666: checking whether -R must be followed by a space" >&5
+echo "configure:4646: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 4669 "configure"
+#line 4649 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:4676: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -4688,14 +4668,14 @@ rm -f conftest*
       else
        LIBS="$ac_xsave_LIBS -R $x_libraries"
        cat > conftest.$ac_ext <<EOF
-#line 4692 "configure"
+#line 4672 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:4699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -4731,12 +4711,12 @@ ac_cv_lib_dnet_dnet_ntoa=no
 else
 
 echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:4735: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:4715: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldnet "
 cat > conftest.$ac_ext <<EOF
-#line 4740 "configure"
+#line 4720 "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
@@ -4747,7 +4727,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:4751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4771,12 +4751,12 @@ fi
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       
 echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:4775: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:4755: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldnet_stub "
 cat > conftest.$ac_ext <<EOF
-#line 4780 "configure"
+#line 4760 "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
@@ -4787,7 +4767,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:4791: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4816,10 +4796,10 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:4820: checking for gethostbyname" >&5
+echo "configure:4800: checking for gethostbyname" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4823 "configure"
+#line 4803 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -4842,7 +4822,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4846: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4826: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -4863,12 +4843,12 @@ fi
     if test $ac_cv_func_gethostbyname = no; then
       
 echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:4867: checking for gethostbyname in -lnsl" >&5
+echo "configure:4847: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lnsl "
 cat > conftest.$ac_ext <<EOF
-#line 4872 "configure"
+#line 4852 "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
@@ -4879,7 +4859,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:4883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4909,10 +4889,10 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:4913: checking for connect" >&5
+echo "configure:4893: checking for connect" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4916 "configure"
+#line 4896 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -4935,7 +4915,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4939: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -4958,12 +4938,12 @@ fi
 xe_msg_checking="for connect in -lsocket"
 test -n "$X_EXTRA_LIBS" && xe_msg_checking="$xe_msg_checking using extra libs $X_EXTRA_LIBS"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:4962: checking "$xe_msg_checking"" >&5
+echo "configure:4942: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lsocket $X_EXTRA_LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4967 "configure"
+#line 4947 "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
@@ -4974,7 +4954,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:4978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4998,10 +4978,10 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:5002: checking for remove" >&5
+echo "configure:4982: checking for remove" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5005 "configure"
+#line 4985 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -5024,7 +5004,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -5045,12 +5025,12 @@ fi
     if test $ac_cv_func_remove = no; then
       
 echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:5049: checking for remove in -lposix" >&5
+echo "configure:5029: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lposix "
 cat > conftest.$ac_ext <<EOF
-#line 5054 "configure"
+#line 5034 "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
@@ -5061,7 +5041,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:5065: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5085,10 +5065,10 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:5089: checking for shmat" >&5
+echo "configure:5069: checking for shmat" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5092 "configure"
+#line 5072 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -5111,7 +5091,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5115: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -5132,12 +5112,12 @@ fi
     if test $ac_cv_func_shmat = no; then
       
 echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:5136: checking for shmat in -lipc" >&5
+echo "configure:5116: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lipc "
 cat > conftest.$ac_ext <<EOF
-#line 5141 "configure"
+#line 5121 "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
@@ -5148,7 +5128,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:5152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5182,12 +5162,12 @@ fi
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   
 echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:5186: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:5166: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lICE "
 cat > conftest.$ac_ext <<EOF
-#line 5191 "configure"
+#line 5171 "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
@@ -5198,7 +5178,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:5202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5273,8 +5253,6 @@ EOF
       break;     fi
   done
 
-    if test "$GCC" = yes -a -d /usr/shlib; then X_LIBS="$X_LIBS -L/usr/shlib" &&  if test "$extra_verbose" = "yes"; then echo "    Appending \"-L/usr/shlib\" to \$X_LIBS"; fi; fi
-
   ld_switch_x_site="$X_LIBS"
 
   
@@ -5367,7 +5345,7 @@ EOF
 
 
     echo "checking for X defines extracted by xmkmf" 1>&6
-echo "configure:5371: checking for X defines extracted by xmkmf" >&5
+echo "configure:5349: checking for X defines extracted by xmkmf" >&5
   rm -fr conftestdir
   if mkdir conftestdir; then
     cd conftestdir
@@ -5399,15 +5377,15 @@ EOF
 
     ac_safe=`echo "X11/Intrinsic.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Intrinsic.h""... $ac_c" 1>&6
-echo "configure:5403: checking for X11/Intrinsic.h" >&5
+echo "configure:5381: checking for X11/Intrinsic.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5406 "configure"
+#line 5384 "configure"
 #include "confdefs.h"
 #include <X11/Intrinsic.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5431,12 +5409,12 @@ fi
 
       
 echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
-echo "configure:5435: checking for XOpenDisplay in -lX11" >&5
+echo "configure:5413: checking for XOpenDisplay in -lX11" >&5
 ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 "
 cat > conftest.$ac_ext <<EOF
-#line 5440 "configure"
+#line 5418 "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
@@ -5447,7 +5425,7 @@ int main() {
 XOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:5451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5429: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5472,12 +5450,12 @@ fi
 xe_msg_checking="for XGetFontProperty in -lX11"
 test -n "-b i486-linuxaout" && xe_msg_checking="$xe_msg_checking using extra libs -b i486-linuxaout"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5476: checking "$xe_msg_checking"" >&5
+echo "configure:5454: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo X11'_'XGetFontProperty | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 -b i486-linuxaout"
 cat > conftest.$ac_ext <<EOF
-#line 5481 "configure"
+#line 5459 "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
@@ -5488,7 +5466,7 @@ int main() {
 XGetFontProperty()
 ; return 0; }
 EOF
-if { (eval echo configure:5492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5515,12 +5493,12 @@ fi
 
     
 echo $ac_n "checking for XShapeSelectInput in -lXext""... $ac_c" 1>&6
-echo "configure:5519: checking for XShapeSelectInput in -lXext" >&5
+echo "configure:5497: checking for XShapeSelectInput in -lXext" >&5
 ac_lib_var=`echo Xext'_'XShapeSelectInput | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXext "
 cat > conftest.$ac_ext <<EOF
-#line 5524 "configure"
+#line 5502 "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
@@ -5531,7 +5509,7 @@ int main() {
 XShapeSelectInput()
 ; return 0; }
 EOF
-if { (eval echo configure:5535: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5513: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5554,12 +5532,12 @@ fi
 
     
 echo $ac_n "checking for XtOpenDisplay in -lXt""... $ac_c" 1>&6
-echo "configure:5558: checking for XtOpenDisplay in -lXt" >&5
+echo "configure:5536: checking for XtOpenDisplay in -lXt" >&5
 ac_lib_var=`echo Xt'_'XtOpenDisplay | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXt "
 cat > conftest.$ac_ext <<EOF
-#line 5563 "configure"
+#line 5541 "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
@@ -5570,7 +5548,7 @@ int main() {
 XtOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:5574: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5552: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5593,18 +5571,17 @@ fi
 
 
   echo $ac_n "checking the version of X11 being used""... $ac_c" 1>&6
-echo "configure:5597: checking the version of X11 being used" >&5
+echo "configure:5575: checking the version of X11 being used" >&5
   cat > conftest.$ac_ext <<EOF
-#line 5599 "configure"
+#line 5577 "configure"
 #include "confdefs.h"
 #include <X11/Intrinsic.h>
     int main(int c, char *v[]) { return c>1 ? XlibSpecificationRelease : 0; }
 EOF
-if { (eval echo configure:5604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:5582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ./conftest foobar; x11_release=$?
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -5625,15 +5602,15 @@ EOF
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5629: checking for $ac_hdr" >&5
+echo "configure:5606: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5632 "configure"
+#line 5609 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5614: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5664,7 +5641,7 @@ done
 
 
     echo $ac_n "checking for XFree86""... $ac_c" 1>&6
-echo "configure:5668: checking for XFree86" >&5
+echo "configure:5645: checking for XFree86" >&5
   if test -d "/usr/X386/include" -o \
           -f "/etc/XF86Config"    -o \
          -f "/etc/X11/XF86Config" -o \
@@ -5684,12 +5661,12 @@ EOF
 
     test -z "$with_xmu" && { 
 echo $ac_n "checking for XmuReadBitmapDataFromFile in -lXmu""... $ac_c" 1>&6
-echo "configure:5688: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
+echo "configure:5665: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
 ac_lib_var=`echo Xmu'_'XmuReadBitmapDataFromFile | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXmu "
 cat > conftest.$ac_ext <<EOF
-#line 5693 "configure"
+#line 5670 "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
@@ -5700,7 +5677,7 @@ int main() {
 XmuReadBitmapDataFromFile()
 ; return 0; }
 EOF
-if { (eval echo configure:5704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5739,19 +5716,19 @@ EOF
 
       
 echo $ac_n "checking for main in -lXbsd""... $ac_c" 1>&6
-echo "configure:5743: checking for main in -lXbsd" >&5
+echo "configure:5720: checking for main in -lXbsd" >&5
 ac_lib_var=`echo Xbsd'_'main | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXbsd "
 cat > conftest.$ac_ext <<EOF
-#line 5748 "configure"
+#line 5725 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5755: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5788,22 +5765,22 @@ fi
 fi 
 if test "$with_msw" != "no"; then
   echo "checking for MS-Windows" 1>&6
-echo "configure:5792: checking for MS-Windows" >&5
+echo "configure:5769: checking for MS-Windows" >&5
   
 echo $ac_n "checking for main in -lgdi32""... $ac_c" 1>&6
-echo "configure:5795: checking for main in -lgdi32" >&5
+echo "configure:5772: checking for main in -lgdi32" >&5
 ac_lib_var=`echo gdi32'_'main | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgdi32 "
 cat > conftest.$ac_ext <<EOF
-#line 5800 "configure"
+#line 5777 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5784: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5867,12 +5844,12 @@ EOF
  fi
     fi
         cat > conftest.$ac_ext <<EOF
-#line 5871 "configure"
+#line 5848 "configure"
 #include "confdefs.h"
 #include <fcntl.h>
     int main() { return (open("/dev/windows", O_RDONLY, 0) > 0)? 0 : 1; }
 EOF
-if { (eval echo configure:5876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:5853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_MSG_SELECT
@@ -5883,7 +5860,6 @@ EOF
 }
 
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
 fi
@@ -5951,7 +5927,7 @@ case "$x_libraries" in *X11R4* )
 esac
 
 echo "checking for session-management option" 1>&6
-echo "configure:5955: checking for session-management option" >&5;
+echo "configure:5931: checking for session-management option" >&5;
 if test "$with_session" != "no"; then
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_SESSION
@@ -5966,15 +5942,15 @@ fi
 test -z "$with_xauth" && test "$window_system" = "none" && with_xauth=no
 test -z "$with_xauth" && { ac_safe=`echo "X11/Xauth.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xauth.h""... $ac_c" 1>&6
-echo "configure:5970: checking for X11/Xauth.h" >&5
+echo "configure:5946: checking for X11/Xauth.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5973 "configure"
+#line 5949 "configure"
 #include "confdefs.h"
 #include <X11/Xauth.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5978: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5954: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5997,12 +5973,12 @@ fi
  }
 test -z "$with_xauth" && { 
 echo $ac_n "checking for XauGetAuthByAddr in -lXau""... $ac_c" 1>&6
-echo "configure:6001: checking for XauGetAuthByAddr in -lXau" >&5
+echo "configure:5977: checking for XauGetAuthByAddr in -lXau" >&5
 ac_lib_var=`echo Xau'_'XauGetAuthByAddr | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXau "
 cat > conftest.$ac_ext <<EOF
-#line 6006 "configure"
+#line 5982 "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
@@ -6013,7 +5989,7 @@ int main() {
 XauGetAuthByAddr()
 ; return 0; }
 EOF
-if { (eval echo configure:6017: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:5993: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6058,15 +6034,15 @@ if test "$with_tooltalk" != "no" ; then
       for dir in "" "Tt/" "desktop/" ; do
     ac_safe=`echo "${dir}tt_c.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ${dir}tt_c.h""... $ac_c" 1>&6
-echo "configure:6062: checking for ${dir}tt_c.h" >&5
+echo "configure:6038: checking for ${dir}tt_c.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6065 "configure"
+#line 6041 "configure"
 #include "confdefs.h"
 #include <${dir}tt_c.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6070: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6046: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6102,12 +6078,12 @@ if test "$with_tooltalk" != "no" ; then
 xe_msg_checking="for tt_message_create in -ltt"
 test -n "$extra_libs" && xe_msg_checking="$xe_msg_checking using extra libs $extra_libs"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6106: checking "$xe_msg_checking"" >&5
+echo "configure:6082: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo tt'_'tt_message_create | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltt $extra_libs"
 cat > conftest.$ac_ext <<EOF
-#line 6111 "configure"
+#line 6087 "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
@@ -6118,7 +6094,7 @@ int main() {
 tt_message_create()
 ; return 0; }
 EOF
-if { (eval echo configure:6122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6098: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6175,15 +6151,15 @@ fi
 
 test -z "$with_cde" && { ac_safe=`echo "Dt/Dt.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Dt/Dt.h""... $ac_c" 1>&6
-echo "configure:6179: checking for Dt/Dt.h" >&5
+echo "configure:6155: checking for Dt/Dt.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6182 "configure"
+#line 6158 "configure"
 #include "confdefs.h"
 #include <Dt/Dt.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6187: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6163: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6206,12 +6182,12 @@ fi
  }
 test -z "$with_cde" && { 
 echo $ac_n "checking for DtDndDragStart in -lDtSvc""... $ac_c" 1>&6
-echo "configure:6210: checking for DtDndDragStart in -lDtSvc" >&5
+echo "configure:6186: checking for DtDndDragStart in -lDtSvc" >&5
 ac_lib_var=`echo DtSvc'_'DtDndDragStart | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lDtSvc "
 cat > conftest.$ac_ext <<EOF
-#line 6215 "configure"
+#line 6191 "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
@@ -6222,7 +6198,7 @@ int main() {
 DtDndDragStart()
 ; return 0; }
 EOF
-if { (eval echo configure:6226: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6291,7 +6267,7 @@ EOF
 fi
 
 echo $ac_n "checking if drag and drop API is needed""... $ac_c" 1>&6
-echo "configure:6295: checking if drag and drop API is needed" >&5
+echo "configure:6271: checking if drag and drop API is needed" >&5
 if test "$with_dragndrop" != "no" ; then
   if test -n "$dragndrop_proto" ; then
     with_dragndrop=yes
@@ -6312,18 +6288,18 @@ EOF
 fi
 
 echo "checking for LDAP" 1>&6
-echo "configure:6316: checking for LDAP" >&5
+echo "configure:6292: checking for LDAP" >&5
 test -z "$with_ldap" && { ac_safe=`echo "ldap.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ldap.h""... $ac_c" 1>&6
-echo "configure:6319: checking for ldap.h" >&5
+echo "configure:6295: checking for ldap.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6322 "configure"
+#line 6298 "configure"
 #include "confdefs.h"
 #include <ldap.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6327: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6303: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6346,15 +6322,15 @@ fi
  }
 test -z "$with_ldap" && { ac_safe=`echo "lber.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for lber.h""... $ac_c" 1>&6
-echo "configure:6350: checking for lber.h" >&5
+echo "configure:6326: checking for lber.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6353 "configure"
+#line 6329 "configure"
 #include "confdefs.h"
 #include <lber.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6358: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6334: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6380,12 +6356,12 @@ if test "$with_ldap" != "no"; then
 xe_msg_checking="for ldap_open in -lldap"
 test -n "-llber" && xe_msg_checking="$xe_msg_checking using extra libs -llber"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6384: checking "$xe_msg_checking"" >&5
+echo "configure:6360: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap -llber"
 cat > conftest.$ac_ext <<EOF
-#line 6389 "configure"
+#line 6365 "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
@@ -6396,7 +6372,7 @@ int main() {
 ldap_open()
 ; return 0; }
 EOF
-if { (eval echo configure:6400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6419,12 +6395,12 @@ fi
  }
   test "$with_umich_ldap" = "no" && { 
 echo $ac_n "checking for ldap_set_option in -lldap10""... $ac_c" 1>&6
-echo "configure:6423: checking for ldap_set_option in -lldap10" >&5
+echo "configure:6399: checking for ldap_set_option in -lldap10" >&5
 ac_lib_var=`echo ldap10'_'ldap_set_option | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap10 "
 cat > conftest.$ac_ext <<EOF
-#line 6428 "configure"
+#line 6404 "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
@@ -6435,7 +6411,7 @@ int main() {
 ldap_set_option()
 ; return 0; }
 EOF
-if { (eval echo configure:6439: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6499,15 +6475,14 @@ fi
 
 if test "$window_system" != "none"; then
   echo "checking for graphics libraries" 1>&6
-echo "configure:6503: checking for graphics libraries" >&5
+echo "configure:6479: checking for graphics libraries" >&5
 
-    xpm_problem=""
-  if test -z "$with_xpm"; then
+    if test -z "$with_xpm"; then
     echo $ac_n "checking for Xpm - no older than 3.4f""... $ac_c" 1>&6
-echo "configure:6508: checking for Xpm - no older than 3.4f" >&5
+echo "configure:6483: checking for Xpm - no older than 3.4f" >&5
     xe_check_libs=-lXpm
     cat > conftest.$ac_ext <<EOF
-#line 6511 "configure"
+#line 6486 "configure"
 #include "confdefs.h"
 #include <X11/xpm.h>
     int main(int c, char **v) {
@@ -6515,28 +6490,27 @@ echo "configure:6508: checking for Xpm - no older than 3.4f" >&5
       XpmIncludeVersion != XpmLibraryVersion() ? 1 :
       XpmIncludeVersion < 30406 ? 2 : 0 ;}
 EOF
-if { (eval echo configure:6519: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:6494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ./conftest dummy_arg; xpm_status=$?;
-      if test "$xpm_status" = "0"; then
+      if test "$?" = "0"; then
         with_xpm=yes;
       else
         with_xpm=no;
-        if test "$xpm_status" = "1"; then
+        if test "$?" = "1"; then
           xpm_problem="Xpm library version and header file version don't match!"
-        elif test "$xpm_status" = "2"; then
+        elif test "$?" = "2"; then
           xpm_problem="Xpm library version is too old!"
         else
           xpm_problem="Internal xpm detection logic error!"
         fi
         echo "
-*** WARNING *** $xpm_problem
+*** WARNING *** $problem
   I'm not touching that with a 10-foot pole!
   If you really want to use the installed version of Xpm, rerun
-  configure and add '--with-xpm=yes', but don't blame me if XEmacs crashes!"
+  configure --with-xpm=yes, but don't blame me if XEmacs crashes!"
     fi
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -6557,17 +6531,17 @@ EOF
 
     libs_x="-lXpm $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-lXpm\" to \$libs_x"; fi
     echo $ac_n "checking for \"FOR_MSW\" xpm""... $ac_c" 1>&6
-echo "configure:6561: checking for \"FOR_MSW\" xpm" >&5
+echo "configure:6535: checking for \"FOR_MSW\" xpm" >&5
     xe_check_libs=-lXpm
     cat > conftest.$ac_ext <<EOF
-#line 6564 "configure"
+#line 6538 "configure"
 #include "confdefs.h"
 
 int main() {
 XpmCreatePixmapFromData()
 ; return 0; }
 EOF
-if { (eval echo configure:6571: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6545: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   xpm_for_msw=no
 else
@@ -6591,30 +6565,15 @@ EOF
     fi
   fi
 
-        if test "$with_gif" != "no"; then
-    with_gif="yes"
-    { test "$extra_verbose" = "yes" && cat << \EOF
-    Defining HAVE_GIF
-EOF
-cat >> confdefs.h <<\EOF
-#define HAVE_GIF 1
-EOF
-}
-
-    extra_objs="$extra_objs dgif_lib.o gif_io.o" &&  if test "$extra_verbose" = "yes"; then
-   echo "    xemacs will be linked with \"dgif_lib.o gif_io.o\""
- fi
-  fi
-
       if test "$with_png $with_tiff" != "no no"; then
     
 echo $ac_n "checking for inflate in -lc""... $ac_c" 1>&6
-echo "configure:6613: checking for inflate in -lc" >&5
+echo "configure:6572: checking for inflate in -lc" >&5
 ac_lib_var=`echo c'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lc "
 cat > conftest.$ac_ext <<EOF
-#line 6618 "configure"
+#line 6577 "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
@@ -6625,7 +6584,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:6629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6644,12 +6603,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for inflate in -lz""... $ac_c" 1>&6
-echo "configure:6648: checking for inflate in -lz" >&5
+echo "configure:6607: checking for inflate in -lz" >&5
 ac_lib_var=`echo z'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lz "
 cat > conftest.$ac_ext <<EOF
-#line 6653 "configure"
+#line 6612 "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
@@ -6660,7 +6619,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:6664: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6679,12 +6638,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for inflate in -lgz""... $ac_c" 1>&6
-echo "configure:6683: checking for inflate in -lgz" >&5
+echo "configure:6642: checking for inflate in -lgz" >&5
 ac_lib_var=`echo gz'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgz "
 cat > conftest.$ac_ext <<EOF
-#line 6688 "configure"
+#line 6647 "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
@@ -6695,7 +6654,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:6699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
   fi
 
+    echo $ac_n "checking for gifreader""... $ac_c" 1>&6
+echo "configure:6687: checking for gifreader" >&5
+  test -z "$with_gif" && { ac_safe=`echo "gifrlib.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for gifrlib.h""... $ac_c" 1>&6
+echo "configure:6690: checking for gifrlib.h" >&5
+
+cat > conftest.$ac_ext <<EOF
+#line 6693 "configure"
+#include "confdefs.h"
+#include <gifrlib.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:6698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+with_gif=no
+fi
+ }
+  test -z "$with_gif" && { 
+echo $ac_n "checking for GetGifError in -lgifreader""... $ac_c" 1>&6
+echo "configure:6721: checking for GetGifError in -lgifreader" >&5
+ac_lib_var=`echo gifreader'_'GetGifError | sed 'y%./+-%__p_%'`
+
+xe_check_libs=" -lgifreader "
+cat > conftest.$ac_ext <<EOF
+#line 6726 "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 GetGifError();
+
+int main() {
+GetGifError()
+; return 0; }
+EOF
+if { (eval echo configure:6737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+xe_check_libs=""
+
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
+  echo "$ac_t""yes" 1>&6
+  : 
+else
+  echo "$ac_t""no" 1>&6
+with_gif=no
+fi
+
+ }
+  test -z "$with_gif" && with_gif=yes
+  if test "$with_gif" = "yes"; then
+    { test "$extra_verbose" = "yes" && cat << \EOF
+    Defining HAVE_GIF
+EOF
+cat >> confdefs.h <<\EOF
+#define HAVE_GIF 1
+EOF
+}
+
+    libs_x="-lgifreader $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-lgifreader\" to \$libs_x"; fi
+  fi
+
     test -z "$with_jpeg" && { ac_safe=`echo "jpeglib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for jpeglib.h""... $ac_c" 1>&6
-echo "configure:6729: checking for jpeglib.h" >&5
+echo "configure:6773: checking for jpeglib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6732 "configure"
+#line 6776 "configure"
 #include "confdefs.h"
 #include <jpeglib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6737: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6756,12 +6800,12 @@ fi
  }
   test -z "$with_jpeg" && { 
 echo $ac_n "checking for jpeg_destroy_decompress in -ljpeg""... $ac_c" 1>&6
-echo "configure:6760: checking for jpeg_destroy_decompress in -ljpeg" >&5
+echo "configure:6804: checking for jpeg_destroy_decompress in -ljpeg" >&5
 ac_lib_var=`echo jpeg'_'jpeg_destroy_decompress | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ljpeg "
 cat > conftest.$ac_ext <<EOF
-#line 6765 "configure"
+#line 6809 "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
@@ -6772,7 +6816,7 @@ int main() {
 jpeg_destroy_decompress()
 ; return 0; }
 EOF
-if { (eval echo configure:6776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6820: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6806,12 +6850,34 @@ EOF
     libs_x="-ljpeg $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-ljpeg\" to \$libs_x"; fi
   fi
 
-    png_problem=""
+    if test -z "$with_png"; then
+    echo $ac_n "checking for png.h - no older than 0.96""... $ac_c" 1>&6
+echo "configure:6856: checking for png.h - no older than 0.96" >&5
+    cat > conftest.$ac_ext <<EOF
+#line 6858 "configure"
+#include "confdefs.h"
+#include <png.h>
+#if PNG_LIBPNG_VER >= 96
+yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6; with_png=no
+fi
+rm -f conftest*
+
+  fi
   test -z "$with_png" && { echo $ac_n "checking for pow""... $ac_c" 1>&6
-echo "configure:6812: checking for pow" >&5
+echo "configure:6878: checking for pow" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6815 "configure"
+#line 6881 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char pow(); below.  */
@@ -6834,7 +6900,7 @@ pow();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6904: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_pow=yes"
 else
@@ -6853,45 +6919,14 @@ else
 with_png=no
 fi
  }
-  test -z "$with_png" && { ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for png.h""... $ac_c" 1>&6
-echo "configure:6859: checking for png.h" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 6862 "configure"
-#include "confdefs.h"
-#include <png.h>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6867: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  :
-else
-  echo "$ac_t""no" 1>&6
-with_png=no
-fi
- }
   test -z "$with_png" && { 
 echo $ac_n "checking for png_read_image in -lpng""... $ac_c" 1>&6
-echo "configure:6890: checking for png_read_image in -lpng" >&5
+echo "configure:6925: checking for png_read_image in -lpng" >&5
 ac_lib_var=`echo png'_'png_read_image | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpng "
 cat > conftest.$ac_ext <<EOF
-#line 6895 "configure"
+#line 6930 "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
@@ -6902,7 +6937,7 @@ int main() {
 png_read_image()
 ; return 0; }
 EOF
-if { (eval echo configure:6906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6923,48 +6958,7 @@ with_png=no
 fi
 
  }
-  if test -z "$with_png"; then
-    echo $ac_n "checking for workable png version information""... $ac_c" 1>&6
-echo "configure:6929: checking for workable png version information" >&5
-    xe_check_libs="-lpng -lz"
-    cat > conftest.$ac_ext <<EOF
-#line 6932 "configure"
-#include "confdefs.h"
-#include <png.h>
-    int main(int c, char **v) {
-    if (c == 1) return 0;
-    if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING) != 0) return 1;
-    return (PNG_LIBPNG_VER < 10002) ? 2 : 0 ;}
-EOF
-if { (eval echo configure:6940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
-then
-  ./conftest dummy_arg; png_status=$?;
-      if test "$png_status" = "0"; then
-       with_png=yes;
-      else
-       with_png=no;
-       if test "$png_status" = "1"; then
-         png_problem="PNG library version and header file don't match!"
-        elif test "$png_status" = "2"; then
-         png_problem="PNG library version too old (pre 1.0.2)!"
-       fi
-       echo "
-*** WARNING *** $png_problem
-  I'm not touching that with a 10-foot pole!
-  If you really want to use the installed version of libPNG, rerun
-  configure and add '--with-png=yes', but don't blame me if XEmacs crashes!"
-    fi
-else
-  conftest_rc="$?"
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  with_png=no
-fi
-rm -fr conftest*
-    xe_check_libs=
-    echo "$ac_t""$with_png" 1>&6
-  fi
+  test -z "$with_png" && with_png=yes
   if test "$with_png" = "yes"; then
     { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_PNG
@@ -6979,15 +6973,15 @@ EOF
 
     test -z "$with_tiff" && { ac_safe=`echo "tiffio.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for tiffio.h""... $ac_c" 1>&6
-echo "configure:6983: checking for tiffio.h" >&5
+echo "configure:6977: checking for tiffio.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6986 "configure"
+#line 6980 "configure"
 #include "confdefs.h"
 #include <tiffio.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6991: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6985: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7010,12 +7004,12 @@ fi
  }
   test -z "$with_tiff" && { 
 echo $ac_n "checking for TIFFClientOpen in -ltiff""... $ac_c" 1>&6
-echo "configure:7014: checking for TIFFClientOpen in -ltiff" >&5
+echo "configure:7008: checking for TIFFClientOpen in -ltiff" >&5
 ac_lib_var=`echo tiff'_'TIFFClientOpen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltiff "
 cat > conftest.$ac_ext <<EOF
-#line 7019 "configure"
+#line 7013 "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
@@ -7026,7 +7020,7 @@ int main() {
 TIFFClientOpen()
 ; return 0; }
 EOF
-if { (eval echo configure:7030: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7024: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7065,19 +7059,19 @@ fi
 if test "$with_x11" = "yes"; then
 
   echo "checking for X11 graphics libraries" 1>&6
-echo "configure:7069: checking for X11 graphics libraries" >&5
+echo "configure:7063: checking for X11 graphics libraries" >&5
 
     test -z "$with_xface" && { ac_safe=`echo "compface.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for compface.h""... $ac_c" 1>&6
-echo "configure:7073: checking for compface.h" >&5
+echo "configure:7067: checking for compface.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7076 "configure"
+#line 7070 "configure"
 #include "confdefs.h"
 #include <compface.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7081: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7075: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7100,12 +7094,12 @@ fi
  }
   test -z "$with_xface" && { 
 echo $ac_n "checking for UnGenFace in -lcompface""... $ac_c" 1>&6
-echo "configure:7104: checking for UnGenFace in -lcompface" >&5
+echo "configure:7098: checking for UnGenFace in -lcompface" >&5
 ac_lib_var=`echo compface'_'UnGenFace | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcompface "
 cat > conftest.$ac_ext <<EOF
-#line 7109 "configure"
+#line 7103 "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
@@ -7116,7 +7110,7 @@ int main() {
 UnGenFace()
 ; return 0; }
 EOF
-if { (eval echo configure:7120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7114: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7152,12 +7146,12 @@ EOF
 
     
 echo $ac_n "checking for XawScrollbarSetThumb in -lXaw""... $ac_c" 1>&6
-echo "configure:7156: checking for XawScrollbarSetThumb in -lXaw" >&5
+echo "configure:7150: checking for XawScrollbarSetThumb in -lXaw" >&5
 ac_lib_var=`echo Xaw'_'XawScrollbarSetThumb | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXaw "
 cat > conftest.$ac_ext <<EOF
-#line 7161 "configure"
+#line 7155 "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
@@ -7168,7 +7162,7 @@ int main() {
 XawScrollbarSetThumb()
 ; return 0; }
 EOF
-if { (eval echo configure:7172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7192,15 +7186,15 @@ fi
                     
     ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:7196: checking for Xm/Xm.h" >&5
+echo "configure:7190: checking for Xm/Xm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7199 "configure"
+#line 7193 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7204: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7198: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7217,12 +7211,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   
 echo $ac_n "checking for XmStringFree in -lXm""... $ac_c" 1>&6
-echo "configure:7221: checking for XmStringFree in -lXm" >&5
+echo "configure:7215: checking for XmStringFree in -lXm" >&5
 ac_lib_var=`echo Xm'_'XmStringFree | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXm "
 cat > conftest.$ac_ext <<EOF
-#line 7226 "configure"
+#line 7220 "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
@@ -7233,7 +7227,7 @@ int main() {
 XmStringFree()
 ; return 0; }
 EOF
-if { (eval echo configure:7237: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7262,9 +7256,9 @@ fi
 
   if test "$have_motif" = "yes"; then
         echo $ac_n "checking for Lesstif""... $ac_c" 1>&6
-echo "configure:7266: checking for Lesstif" >&5
+echo "configure:7260: checking for Lesstif" >&5
     cat > conftest.$ac_ext <<EOF
-#line 7268 "configure"
+#line 7262 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 #ifdef LESSTIF_VERSION
@@ -7548,7 +7542,7 @@ fi
 
 if test "$with_mule" = "yes" ; then
   echo "checking for Mule-related features" 1>&6
-echo "configure:7552: checking for Mule-related features" >&5
+echo "configure:7546: checking for Mule-related features" >&5
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining MULE
 EOF
@@ -7573,15 +7567,15 @@ EOF
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:7577: checking for $ac_hdr" >&5
+echo "configure:7571: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7580 "configure"
+#line 7574 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7585: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7579: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7612,12 +7606,12 @@ done
 
   
 echo $ac_n "checking for strerror in -lintl""... $ac_c" 1>&6
-echo "configure:7616: checking for strerror in -lintl" >&5
+echo "configure:7610: checking for strerror in -lintl" >&5
 ac_lib_var=`echo intl'_'strerror | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lintl "
 cat > conftest.$ac_ext <<EOF
-#line 7621 "configure"
+#line 7615 "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
@@ -7628,7 +7622,7 @@ int main() {
 strerror()
 ; return 0; }
 EOF
-if { (eval echo configure:7632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7661,19 +7655,19 @@ fi
 
 
   echo "checking for Mule input methods" 1>&6
-echo "configure:7665: checking for Mule input methods" >&5
+echo "configure:7659: checking for Mule input methods" >&5
         case "$with_xim" in "" | "yes" )
     echo "checking for XIM" 1>&6
-echo "configure:7668: checking for XIM" >&5
+echo "configure:7662: checking for XIM" >&5
         if test "$have_lesstif" = "yes"; then with_xim=xlib
     else 
 echo $ac_n "checking for XmImMbLookupString in -lXm""... $ac_c" 1>&6
-echo "configure:7672: checking for XmImMbLookupString in -lXm" >&5
+echo "configure:7666: checking for XmImMbLookupString in -lXm" >&5
 ac_lib_var=`echo Xm'_'XmImMbLookupString | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXm "
 cat > conftest.$ac_ext <<EOF
-#line 7677 "configure"
+#line 7671 "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
@@ -7684,7 +7678,7 @@ int main() {
 XmImMbLookupString()
 ; return 0; }
 EOF
-if { (eval echo configure:7688: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7750,15 +7744,15 @@ EOF
 
     if test "$with_xfs" = "yes" ; then
     echo "checking for XFontSet" 1>&6
-echo "configure:7754: checking for XFontSet" >&5
+echo "configure:7748: checking for XFontSet" >&5
     
 echo $ac_n "checking for XmbDrawString in -lX11""... $ac_c" 1>&6
-echo "configure:7757: checking for XmbDrawString in -lX11" >&5
+echo "configure:7751: checking for XmbDrawString in -lX11" >&5
 ac_lib_var=`echo X11'_'XmbDrawString | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 "
 cat > conftest.$ac_ext <<EOF
-#line 7762 "configure"
+#line 7756 "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
@@ -7769,7 +7763,7 @@ int main() {
 XmbDrawString()
 ; return 0; }
 EOF
-if { (eval echo configure:7773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7809,15 +7803,15 @@ EOF
     test "$with_wnn6" = "yes" && with_wnn=yes # wnn6 implies wnn support
   test -z "$with_wnn" && { ac_safe=`echo "wnn/jllib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for wnn/jllib.h""... $ac_c" 1>&6
-echo "configure:7813: checking for wnn/jllib.h" >&5
+echo "configure:7807: checking for wnn/jllib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7816 "configure"
+#line 7810 "configure"
 #include "confdefs.h"
 #include <wnn/jllib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7821: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7815: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7842,10 +7836,10 @@ fi
     for ac_func in crypt
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7846: checking for $ac_func" >&5
+echo "configure:7840: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7849 "configure"
+#line 7843 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -7868,7 +7862,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7897,12 +7891,12 @@ done
 
     test "$ac_cv_func_crypt" != "yes" && { 
 echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:7901: checking for crypt in -lcrypt" >&5
+echo "configure:7895: checking for crypt in -lcrypt" >&5
 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcrypt "
 cat > conftest.$ac_ext <<EOF
-#line 7906 "configure"
+#line 7900 "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
@@ -7913,7 +7907,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:7917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7947,12 +7941,12 @@ fi
   fi
     test -z "$with_wnn" && { 
 echo $ac_n "checking for jl_dic_list_e in -lwnn""... $ac_c" 1>&6
-echo "configure:7951: checking for jl_dic_list_e in -lwnn" >&5
+echo "configure:7945: checking for jl_dic_list_e in -lwnn" >&5
 ac_lib_var=`echo wnn'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn "
 cat > conftest.$ac_ext <<EOF
-#line 7956 "configure"
+#line 7950 "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
@@ -7963,7 +7957,7 @@ int main() {
 jl_dic_list_e()
 ; return 0; }
 EOF
-if { (eval echo configure:7967: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:7961: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8001,12 +7995,12 @@ EOF
     if test "$with_wnn6" != "no"; then
       
 echo $ac_n "checking for jl_fi_dic_list in -lwnn""... $ac_c" 1>&6
-echo "configure:8005: checking for jl_fi_dic_list in -lwnn" >&5
+echo "configure:7999: checking for jl_fi_dic_list in -lwnn" >&5
 ac_lib_var=`echo wnn'_'jl_fi_dic_list | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn "
 cat > conftest.$ac_ext <<EOF
-#line 8010 "configure"
+#line 8004 "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
@@ -8017,7 +8011,7 @@ int main() {
 jl_fi_dic_list()
 ; return 0; }
 EOF
-if { (eval echo configure:8021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8052,15 +8046,15 @@ EOF
   if test "$with_canna" != "no"; then
     ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:8056: checking for canna/jrkanji.h" >&5
+echo "configure:8050: checking for canna/jrkanji.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8059 "configure"
+#line 8053 "configure"
 #include "confdefs.h"
 #include <canna/jrkanji.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8064: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8058: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8087,15 +8081,15 @@ fi
     c_switch_site="$c_switch_site -I/usr/local/canna/include"
     ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:8091: checking for canna/jrkanji.h" >&5
+echo "configure:8085: checking for canna/jrkanji.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8094 "configure"
+#line 8088 "configure"
 #include "confdefs.h"
 #include <canna/jrkanji.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8099: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8093: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8123,15 +8117,15 @@ fi
 
   test -z "$with_canna" && { ac_safe=`echo "canna/RK.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/RK.h""... $ac_c" 1>&6
-echo "configure:8127: checking for canna/RK.h" >&5
+echo "configure:8121: checking for canna/RK.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8130 "configure"
+#line 8124 "configure"
 #include "confdefs.h"
 #include <canna/RK.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8135: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8129: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8154,12 +8148,12 @@ fi
  }
   test -z "$with_canna" && { 
 echo $ac_n "checking for RkBgnBun in -lRKC""... $ac_c" 1>&6
-echo "configure:8158: checking for RkBgnBun in -lRKC" >&5
+echo "configure:8152: checking for RkBgnBun in -lRKC" >&5
 ac_lib_var=`echo RKC'_'RkBgnBun | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lRKC "
 cat > conftest.$ac_ext <<EOF
-#line 8163 "configure"
+#line 8157 "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
@@ -8170,7 +8164,7 @@ int main() {
 RkBgnBun()
 ; return 0; }
 EOF
-if { (eval echo configure:8174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8193,12 +8187,12 @@ fi
  }
   test -z "$with_canna" && { 
 echo $ac_n "checking for jrKanjiControl in -lcanna""... $ac_c" 1>&6
-echo "configure:8197: checking for jrKanjiControl in -lcanna" >&5
+echo "configure:8191: checking for jrKanjiControl in -lcanna" >&5
 ac_lib_var=`echo canna'_'jrKanjiControl | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcanna "
 cat > conftest.$ac_ext <<EOF
-#line 8202 "configure"
+#line 8196 "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
@@ -8209,7 +8203,7 @@ int main() {
 jrKanjiControl()
 ; return 0; }
 EOF
-if { (eval echo configure:8213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8207: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8258,12 +8252,12 @@ if test "$need_motif" = "yes" ; then
   libs_x="-lXm $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-lXm\" to \$libs_x"; fi
     
 echo $ac_n "checking for layout_object_getvalue in -li18n""... $ac_c" 1>&6
-echo "configure:8262: checking for layout_object_getvalue in -li18n" >&5
+echo "configure:8256: checking for layout_object_getvalue in -li18n" >&5
 ac_lib_var=`echo i18n'_'layout_object_getvalue | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -li18n "
 cat > conftest.$ac_ext <<EOF
-#line 8267 "configure"
+#line 8261 "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
@@ -8274,7 +8268,7 @@ int main() {
 layout_object_getvalue()
 ; return 0; }
 EOF
-if { (eval echo configure:8278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8360,10 +8354,10 @@ fi
 for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime gethostname getpagesize gettimeofday getcwd getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf strcasecmp strerror tzset ulimit usleep utimes waitpid vsnprintf
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8364: checking for $ac_func" >&5
+echo "configure:8358: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8367 "configure"
+#line 8361 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -8386,7 +8380,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:8390: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -8423,10 +8417,10 @@ case "$opsys" in
     for ac_func in realpath
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8427: checking for $ac_func" >&5
+echo "configure:8421: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8430 "configure"
+#line 8424 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -8449,7 +8443,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:8453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8447: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -8482,16 +8476,16 @@ done
 esac
 
 echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
-echo "configure:8486: checking whether netdb declares h_errno" >&5
+echo "configure:8480: checking whether netdb declares h_errno" >&5
 cat > conftest.$ac_ext <<EOF
-#line 8488 "configure"
+#line 8482 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 int main() {
 return h_errno;
 ; return 0; }
 EOF
-if { (eval echo configure:8495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
@@ -8511,16 +8505,16 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking for sigsetjmp""... $ac_c" 1>&6
-echo "configure:8515: checking for sigsetjmp" >&5
+echo "configure:8509: checking for sigsetjmp" >&5
 cat > conftest.$ac_ext <<EOF
-#line 8517 "configure"
+#line 8511 "configure"
 #include "confdefs.h"
 #include <setjmp.h>
 int main() {
 sigjmp_buf bar; sigsetjmp (bar, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:8524: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8518: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
@@ -8540,11 +8534,11 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
-echo "configure:8544: checking whether localtime caches TZ" >&5
+echo "configure:8538: checking whether localtime caches TZ" >&5
 
 if test "$ac_cv_func_tzset" = "yes"; then
 cat > conftest.$ac_ext <<EOF
-#line 8548 "configure"
+#line 8542 "configure"
 #include "confdefs.h"
 #include <time.h>
 #if STDC_HEADERS
@@ -8579,11 +8573,10 @@ main()
   exit (0);
 }
 EOF
-if { (eval echo configure:8583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:8577: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   emacs_cv_localtime_cache=no
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -8609,9 +8602,9 @@ fi
 
 if test "$HAVE_TIMEVAL" = "yes"; then
 echo $ac_n "checking whether gettimeofday accepts one or two arguments""... $ac_c" 1>&6
-echo "configure:8613: checking whether gettimeofday accepts one or two arguments" >&5
+echo "configure:8606: checking whether gettimeofday accepts one or two arguments" >&5
 cat > conftest.$ac_ext <<EOF
-#line 8615 "configure"
+#line 8608 "configure"
 #include "confdefs.h"
 
 #ifdef TIME_WITH_SYS_TIME
@@ -8633,7 +8626,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:8637: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   echo "$ac_t""two" 1>&6
 else
@@ -8655,19 +8648,19 @@ fi
 
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:8659: checking for inline" >&5
+echo "configure:8652: checking for inline" >&5
 
 ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 8664 "configure"
+#line 8657 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:8671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:8664: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -8717,17 +8710,17 @@ fi
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:8721: checking for working alloca.h" >&5
+echo "configure:8714: checking for working alloca.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8724 "configure"
+#line 8717 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:8731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -8751,10 +8744,10 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:8755: checking for alloca" >&5
+echo "configure:8748: checking for alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8758 "configure"
+#line 8751 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -8777,7 +8770,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:8781: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8774: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -8816,10 +8809,10 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:8820: checking whether alloca needs Cray hooks" >&5
+echo "configure:8813: checking whether alloca needs Cray hooks" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8823 "configure"
+#line 8816 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -8843,10 +8836,10 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:8847: checking for $ac_func" >&5
+echo "configure:8840: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8850 "configure"
+#line 8843 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -8869,7 +8862,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:8873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:8866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -8899,10 +8892,10 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:8903: checking stack direction for C alloca" >&5
+echo "configure:8896: checking stack direction for C alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8906 "configure"
+#line 8899 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -8921,11 +8914,10 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:8925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:8918: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_c_stack_direction=1
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -8950,15 +8942,15 @@ test -n "$ALLOCA" && extra_objs="$extra_objs $ALLOCA" &&  if test "$extra_verbos
 
 ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:8954: checking for vfork.h" >&5
+echo "configure:8946: checking for vfork.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8957 "configure"
+#line 8949 "configure"
 #include "confdefs.h"
 #include <vfork.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8962: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8954: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8986,10 +8978,10 @@ else
 fi
 
 echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:8990: checking for working vfork" >&5
+echo "configure:8982: checking for working vfork" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8993 "configure"
+#line 8985 "configure"
 #include "confdefs.h"
 /* Thanks to Paul Eggert for this test.  */
 #include <stdio.h>
@@ -9084,11 +9076,10 @@ main() {
   }
 }
 EOF
-if { (eval echo configure:9088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9080: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_func_vfork_works=yes
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -9110,10 +9101,10 @@ fi
 
 
 echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
-echo "configure:9114: checking for working strcoll" >&5
+echo "configure:9105: checking for working strcoll" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9117 "configure"
+#line 9108 "configure"
 #include "confdefs.h"
 #include <string.h>
 main ()
@@ -9123,11 +9114,10 @@ main ()
        strcoll ("123", "456") >= 0);
 }
 EOF
-if { (eval echo configure:9127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9118: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_func_strcoll_works=yes
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -9151,10 +9141,10 @@ fi
 for ac_func in getpgrp
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:9155: checking for $ac_func" >&5
+echo "configure:9145: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9158 "configure"
+#line 9148 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -9177,7 +9167,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:9181: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -9205,10 +9195,10 @@ fi
 done
 
 echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:9209: checking whether getpgrp takes no argument" >&5
+echo "configure:9199: checking whether getpgrp takes no argument" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9212 "configure"
+#line 9202 "configure"
 #include "confdefs.h"
 
 /*
@@ -9263,11 +9253,10 @@ main()
 }
 
 EOF
-if { (eval echo configure:9267: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   ac_cv_func_getpgrp_void=yes
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -9290,10 +9279,10 @@ fi
 
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:9294: checking for working mmap" >&5
+echo "configure:9283: checking for working mmap" >&5
 case "$opsys" in ultrix* ) have_mmap=no ;; *)
 cat > conftest.$ac_ext <<EOF
-#line 9297 "configure"
+#line 9286 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <unistd.h>
@@ -9326,11 +9315,10 @@ int main (int argc, char *argv[])
   return 1;
 }
 EOF
-if { (eval echo configure:9330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:9319: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   have_mmap=yes
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -9347,271 +9335,6 @@ cat >> confdefs.h <<\EOF
 EOF
 }
 
-for ac_hdr in unistd.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9355: checking for $ac_hdr" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 9358 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9363: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out`
-if test -z "$ac_err"; then
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=yes"
-else
-  echo "$ac_err" >&5
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
-  { test "$extra_verbose" = "yes" && cat << EOF
-    Defining $ac_tr_hdr
-EOF
-cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-}
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-for ac_func in getpagesize
-do
-echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:9395: checking for $ac_func" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 9398 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func(); below.  */
-#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();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-$ac_func();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:9421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-  rm -rf conftest*
-  eval "ac_cv_func_$ac_func=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_$ac_func=no"
-fi
-rm -f conftest*
-
-if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
-  { test "$extra_verbose" = "yes" && cat << EOF
-    Defining $ac_tr_func
-EOF
-cat >> confdefs.h <<EOF
-#define $ac_tr_func 1
-EOF
-}
-else
-  echo "$ac_t""no" 1>&6
-fi
-done
-
-echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:9449: checking for working mmap" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 9452 "configure"
-#include "confdefs.h"
-
-/* Thanks to Mike Haertel and Jim Avera for this test.
-   Here is a matrix of mmap possibilities:
-       mmap private not fixed
-       mmap private fixed at somewhere currently unmapped
-       mmap private fixed at somewhere already mapped
-       mmap shared not fixed
-       mmap shared fixed at somewhere currently unmapped
-       mmap shared fixed at somewhere already mapped
-   For private mappings, we should verify that changes cannot be read()
-   back from the file, nor mmap's back from the file at a different
-   address.  (There have been systems where private was not correctly
-   implemented like the infamous i386 svr4.0, and systems where the
-   VM page cache was not coherent with the filesystem buffer cache
-   like early versions of FreeBSD and possibly contemporary NetBSD.)
-   For shared mappings, we should conversely verify that changes get
-   propogated back to all the places they're supposed to be.
-
-   Grep wants private fixed already mapped.
-   The main things grep needs to know about mmap are:
-   * does it exist and is it safe to write into the mmap'd area
-   * how to use it (BSD variants)  */
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-
-/* This mess was copied from the GNU getpagesize.h.  */
-#ifndef HAVE_GETPAGESIZE
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-# endif
-
-/* Assume that all systems that can run configure have sys/param.h.  */
-# ifndef HAVE_SYS_PARAM_H
-#  define HAVE_SYS_PARAM_H 1
-# endif
-
-# ifdef _SC_PAGESIZE
-#  define getpagesize() sysconf(_SC_PAGESIZE)
-# else /* no _SC_PAGESIZE */
-#  ifdef HAVE_SYS_PARAM_H
-#   include <sys/param.h>
-#   ifdef EXEC_PAGESIZE
-#    define getpagesize() EXEC_PAGESIZE
-#   else /* no EXEC_PAGESIZE */
-#    ifdef NBPG
-#     define getpagesize() NBPG * CLSIZE
-#     ifndef CLSIZE
-#      define CLSIZE 1
-#     endif /* no CLSIZE */
-#    else /* no NBPG */
-#     ifdef NBPC
-#      define getpagesize() NBPC
-#     else /* no NBPC */
-#      ifdef PAGESIZE
-#       define getpagesize() PAGESIZE
-#      endif /* PAGESIZE */
-#     endif /* no NBPC */
-#    endif /* no NBPG */
-#   endif /* no EXEC_PAGESIZE */
-#  else /* no HAVE_SYS_PARAM_H */
-#   define getpagesize() 8192  /* punt totally */
-#  endif /* no HAVE_SYS_PARAM_H */
-# endif /* no _SC_PAGESIZE */
-
-#endif /* no HAVE_GETPAGESIZE */
-
-#ifdef __cplusplus
-extern "C" { void *malloc(unsigned); }
-#else
-char *malloc();
-#endif
-
-int
-main()
-{
-       char *data, *data2, *data3;
-       int i, pagesize;
-       int fd;
-
-       pagesize = getpagesize();
-
-       /*
-        * First, make a file with some known garbage in it.
-        */
-       data = malloc(pagesize);
-       if (!data)
-               exit(1);
-       for (i = 0; i < pagesize; ++i)
-               *(data + i) = rand();
-       umask(0);
-       fd = creat("conftestmmap", 0600);
-       if (fd < 0)
-               exit(1);
-       if (write(fd, data, pagesize) != pagesize)
-               exit(1);
-       close(fd);
-
-       /*
-        * Next, try to mmap the file at a fixed address which
-        * already has something else allocated at it.  If we can,
-        * also make sure that we see the same garbage.
-        */
-       fd = open("conftestmmap", O_RDWR);
-       if (fd < 0)
-               exit(1);
-       data2 = malloc(2 * pagesize);
-       if (!data2)
-               exit(1);
-       data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
-       if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
-           MAP_PRIVATE | MAP_FIXED, fd, 0L))
-               exit(1);
-       for (i = 0; i < pagesize; ++i)
-               if (*(data + i) != *(data2 + i))
-                       exit(1);
-
-       /*
-        * Finally, make sure that changes to the mapped area
-        * do not percolate back to the file as seen by read().
-        * (This is a bug on some variants of i386 svr4.0.)
-        */
-       for (i = 0; i < pagesize; ++i)
-               *(data2 + i) = *(data2 + i) + 1;
-       data3 = malloc(pagesize);
-       if (!data3)
-               exit(1);
-       if (read(fd, data3, pagesize) != pagesize)
-               exit(1);
-       for (i = 0; i < pagesize; ++i)
-               if (*(data + i) != *(data3 + i))
-                       exit(1);
-       close(fd);
-       unlink("conftestmmap");
-       exit(0);
-}
-
-EOF
-if { (eval echo configure:9592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
-then
-  ac_cv_func_mmap_fixed_mapped=yes
-else
-  conftest_rc="$?"
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -fr conftest*
-  ac_cv_func_mmap_fixed_mapped=no
-fi
-rm -fr conftest*
-
-echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
-if test $ac_cv_func_mmap_fixed_mapped = yes; then
-  { test "$extra_verbose" = "yes" && cat << \EOF
-    Defining HAVE_MMAP
-EOF
-cat >> confdefs.h <<\EOF
-#define HAVE_MMAP 1
-EOF
-}
-
-fi
-
 
 test "$GNU_MALLOC" != "yes"   -a "$have_mmap" != "yes" && rel_alloc=no
 test "$rel_alloc" = "default" -a "$have_mmap"  = "yes" && rel_alloc=yes
@@ -9626,15 +9349,15 @@ EOF
 
 ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termios.h""... $ac_c" 1>&6
-echo "configure:9630: checking for termios.h" >&5
+echo "configure:9353: checking for termios.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9633 "configure"
+#line 9356 "configure"
 #include "confdefs.h"
 #include <termios.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9638: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9361: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9677,15 +9400,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "termio.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termio.h""... $ac_c" 1>&6
-echo "configure:9681: checking for termio.h" >&5
+echo "configure:9404: checking for termio.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9684 "configure"
+#line 9407 "configure"
 #include "confdefs.h"
 #include <termio.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9689: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9412: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9717,10 +9440,10 @@ fi
 
 
 echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:9721: checking for socket" >&5
+echo "configure:9444: checking for socket" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9724 "configure"
+#line 9447 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -9743,7 +9466,7 @@ socket();
 
 ; return 0; }
 EOF
-if { (eval echo configure:9747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_socket=yes"
 else
@@ -9758,15 +9481,15 @@ if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "netinet/in.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for netinet/in.h""... $ac_c" 1>&6
-echo "configure:9762: checking for netinet/in.h" >&5
+echo "configure:9485: checking for netinet/in.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9765 "configure"
+#line 9488 "configure"
 #include "confdefs.h"
 #include <netinet/in.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9770: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9493: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9783,15 +9506,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "arpa/inet.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for arpa/inet.h""... $ac_c" 1>&6
-echo "configure:9787: checking for arpa/inet.h" >&5
+echo "configure:9510: checking for arpa/inet.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9790 "configure"
+#line 9513 "configure"
 #include "confdefs.h"
 #include <arpa/inet.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9795: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9518: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9816,9 +9539,9 @@ EOF
 }
 
       echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:9820: checking "for sun_len member in struct sockaddr_un"" >&5
+echo "configure:9543: checking "for sun_len member in struct sockaddr_un"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 9822 "configure"
+#line 9545 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -9829,7 +9552,7 @@ int main() {
 static struct sockaddr_un x; x.sun_len = 1;
 ; return 0; }
 EOF
-if { (eval echo configure:9833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9556: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_SOCKADDR_SUN_LEN
@@ -9847,9 +9570,9 @@ else
 fi
 rm -f conftest*
       echo $ac_n "checking "for ip_mreq struct in netinet/in.h"""... $ac_c" 1>&6
-echo "configure:9851: checking "for ip_mreq struct in netinet/in.h"" >&5
+echo "configure:9574: checking "for ip_mreq struct in netinet/in.h"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 9853 "configure"
+#line 9576 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -9859,7 +9582,7 @@ int main() {
 static struct ip_mreq x;
 ; return 0; }
 EOF
-if { (eval echo configure:9863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9586: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_MULTICAST
@@ -9890,10 +9613,10 @@ fi
 
 
 echo $ac_n "checking for msgget""... $ac_c" 1>&6
-echo "configure:9894: checking for msgget" >&5
+echo "configure:9617: checking for msgget" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9897 "configure"
+#line 9620 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char msgget(); below.  */
@@ -9916,7 +9639,7 @@ msgget();
 
 ; return 0; }
 EOF
-if { (eval echo configure:9920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9643: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_msgget=yes"
 else
@@ -9931,15 +9654,15 @@ if eval "test \"`echo '$ac_cv_func_'msgget`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:9935: checking for sys/ipc.h" >&5
+echo "configure:9658: checking for sys/ipc.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9938 "configure"
+#line 9661 "configure"
 #include "confdefs.h"
 #include <sys/ipc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9943: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9666: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9956,15 +9679,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6
-echo "configure:9960: checking for sys/msg.h" >&5
+echo "configure:9683: checking for sys/msg.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9963 "configure"
+#line 9686 "configure"
 #include "confdefs.h"
 #include <sys/msg.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9968: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9691: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dirent.h""... $ac_c" 1>&6
-echo "configure:10006: checking for dirent.h" >&5
+echo "configure:9729: checking for dirent.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10009 "configure"
+#line 9732 "configure"
 #include "confdefs.h"
 #include <dirent.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10014: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9737: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10037,15 +9760,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "sys/dir.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/dir.h""... $ac_c" 1>&6
-echo "configure:10041: checking for sys/dir.h" >&5
+echo "configure:9764: checking for sys/dir.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10044 "configure"
+#line 9767 "configure"
 #include "confdefs.h"
 #include <sys/dir.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10049: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9772: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for nlist.h""... $ac_c" 1>&6
-echo "configure:10082: checking for nlist.h" >&5
+echo "configure:9805: checking for nlist.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10085 "configure"
+#line 9808 "configure"
 #include "confdefs.h"
 #include <nlist.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10090: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9813: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10116,7 +9839,7 @@ fi
 
 
 echo "checking "for sound support"" 1>&6
-echo "configure:10120: checking "for sound support"" >&5
+echo "configure:9843: checking "for sound support"" >&5
 case "$with_sound" in
   native | both ) with_native_sound=yes;;
   nas    | no   ) with_native_sound=no;;
@@ -10127,15 +9850,15 @@ if test "$with_native_sound" != "no"; then
     if test -n "$native_sound_lib"; then
     ac_safe=`echo "multimedia/audio_device.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for multimedia/audio_device.h""... $ac_c" 1>&6
-echo "configure:10131: checking for multimedia/audio_device.h" >&5
+echo "configure:9854: checking for multimedia/audio_device.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10134 "configure"
+#line 9857 "configure"
 #include "confdefs.h"
 #include <multimedia/audio_device.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9862: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
       if test -z "$native_sound_lib"; then
         
 echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6
-echo "configure:10187: checking for ALopenport in -laudio" >&5
+echo "configure:9910: checking for ALopenport in -laudio" >&5
 ac_lib_var=`echo audio'_'ALopenport | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -laudio "
 cat > conftest.$ac_ext <<EOF
-#line 10192 "configure"
+#line 9915 "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
@@ -10199,7 +9922,7 @@ int main() {
 ALopenport()
 ; return 0; }
 EOF
-if { (eval echo configure:10203: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9926: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       if test -z "$native_sound_lib"; then
        
 echo $ac_n "checking for AOpenAudio in -lAlib""... $ac_c" 1>&6
-echo "configure:10234: checking for AOpenAudio in -lAlib" >&5
+echo "configure:9957: checking for AOpenAudio in -lAlib" >&5
 ac_lib_var=`echo Alib'_'AOpenAudio | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lAlib "
 cat > conftest.$ac_ext <<EOF
-#line 10239 "configure"
+#line 9962 "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
@@ -10246,7 +9969,7 @@ int main() {
 AOpenAudio()
 ; return 0; }
 EOF
-if { (eval echo configure:10250: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:9973: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
     for dir in "machine" "sys" "linux"; do
       ac_safe=`echo "${dir}/soundcard.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ${dir}/soundcard.h""... $ac_c" 1>&6
-echo "configure:10288: checking for ${dir}/soundcard.h" >&5
+echo "configure:10011: checking for ${dir}/soundcard.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10291 "configure"
+#line 10014 "configure"
 #include "confdefs.h"
 #include <${dir}/soundcard.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10296: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10019: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10362,7 +10085,7 @@ EOF
  fi
   libs_x="-laudio $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-laudio\" to \$libs_x"; fi
       cat > conftest.$ac_ext <<EOF
-#line 10366 "configure"
+#line 10089 "configure"
 #include "confdefs.h"
 #include <audio/Xtutil.h>
 EOF
@@ -10389,7 +10112,7 @@ test -z "$with_tty" && with_tty=yes
 
 if test "$with_tty" = "yes"  ; then
   echo "checking for TTY-related features" 1>&6
-echo "configure:10393: checking for TTY-related features" >&5
+echo "configure:10116: checking for TTY-related features" >&5
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_TTY
 EOF
@@ -10405,12 +10128,12 @@ EOF
     if test -z "$with_ncurses"; then
     
 echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:10409: checking for tgetent in -lncurses" >&5
+echo "configure:10132: checking for tgetent in -lncurses" >&5
 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lncurses "
 cat > conftest.$ac_ext <<EOF
-#line 10414 "configure"
+#line 10137 "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
@@ -10421,7 +10144,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:10425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10148: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10454,15 +10177,15 @@ EOF
 
     ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:10458: checking for ncurses/curses.h" >&5
+echo "configure:10181: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10461 "configure"
+#line 10184 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10466: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10189: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
     ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6
-echo "configure:10488: checking for ncurses/term.h" >&5
+echo "configure:10211: checking for ncurses/term.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10491 "configure"
+#line 10214 "configure"
 #include "confdefs.h"
 #include <ncurses/term.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10496: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10219: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
       c_switch_site="$c_switch_site -I/usr/include/ncurses"
       ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:10526: checking for ncurses/curses.h" >&5
+echo "configure:10249: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10529 "configure"
+#line 10252 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10534: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10257: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
        for lib in curses termlib termcap; do
          
 echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6
-echo "configure:10569: checking for tgetent in -l$lib" >&5
+echo "configure:10292: checking for tgetent in -l$lib" >&5
 ac_lib_var=`echo $lib'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$lib "
 cat > conftest.$ac_ext <<EOF
-#line 10574 "configure"
+#line 10297 "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
@@ -10581,7 +10304,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:10585: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       else
        
 echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:10616: checking for tgetent in -lcurses" >&5
+echo "configure:10339: checking for tgetent in -lcurses" >&5
 ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcurses "
 cat > conftest.$ac_ext <<EOF
-#line 10621 "configure"
+#line 10344 "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
@@ -10628,7 +10351,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:10632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10355: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10646,12 +10369,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:10650: checking for tgetent in -ltermcap" >&5
+echo "configure:10373: checking for tgetent in -ltermcap" >&5
 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltermcap "
 cat > conftest.$ac_ext <<EOF
-#line 10655 "configure"
+#line 10378 "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
@@ -10662,7 +10385,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:10666: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10389: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10710,15 +10433,15 @@ EOF
 
     test -z "$with_gpm" && { ac_safe=`echo "gpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for gpm.h""... $ac_c" 1>&6
-echo "configure:10714: checking for gpm.h" >&5
+echo "configure:10437: checking for gpm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10717 "configure"
+#line 10440 "configure"
 #include "confdefs.h"
 #include <gpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10722: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10445: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
  }
   test -z "$with_gpm" && { 
 echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:10745: checking for Gpm_Open in -lgpm" >&5
+echo "configure:10468: checking for Gpm_Open in -lgpm" >&5
 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgpm "
 cat > conftest.$ac_ext <<EOF
-#line 10750 "configure"
+#line 10473 "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
@@ -10757,7 +10480,7 @@ int main() {
 Gpm_Open()
 ; return 0; }
 EOF
-if { (eval echo configure:10761: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10484: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -10806,22 +10529,22 @@ test "$with_x11" = "yes" -o "$with_tty" = "yes" && extra_objs="$extra_objs event
 
 
 echo "checking for database support" 1>&6
-echo "configure:10810: checking for database support" >&5
+echo "configure:10533: checking for database support" >&5
 
 if test "$with_database_gnudbm" != "no"; then
   for ac_hdr in ndbm.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:10817: checking for $ac_hdr" >&5
+echo "configure:10540: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10820 "configure"
+#line 10543 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10825: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10548: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10853,12 +10576,12 @@ done
   if test "$have_ndbm_h" = "yes"; then
     
 echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6
-echo "configure:10857: checking for dbm_open in -lgdbm" >&5
+echo "configure:10580: checking for dbm_open in -lgdbm" >&5
 ac_lib_var=`echo gdbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgdbm "
 cat > conftest.$ac_ext <<EOF
-#line 10862 "configure"
+#line 10585 "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
@@ -10869,7 +10592,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:10873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10596: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
   fi
   if test "$with_database_gnudbm" != "yes"; then
     echo $ac_n "checking for dbm_open""... $ac_c" 1>&6
-echo "configure:10896: checking for dbm_open" >&5
+echo "configure:10619: checking for dbm_open" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10899 "configure"
+#line 10622 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char dbm_open(); below.  */
@@ -10918,7 +10641,7 @@ dbm_open();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_dbm_open=yes"
 else
 
 if test "$with_database_dbm" != "no"; then
   echo $ac_n "checking for dbm_open""... $ac_c" 1>&6
-echo "configure:10958: checking for dbm_open" >&5
+echo "configure:10681: checking for dbm_open" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10961 "configure"
+#line 10684 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char dbm_open(); below.  */
@@ -10980,7 +10703,7 @@ dbm_open();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10707: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_dbm_open=yes"
 else
   if test "$need_libdbm" != "no"; then
     
 echo $ac_n "checking for dbm_open in -ldbm""... $ac_c" 1>&6
-echo "configure:11005: checking for dbm_open in -ldbm" >&5
+echo "configure:10728: checking for dbm_open in -ldbm" >&5
 ac_lib_var=`echo dbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldbm "
 cat > conftest.$ac_ext <<EOF
-#line 11010 "configure"
+#line 10733 "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
@@ -11017,7 +10740,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:11021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
 if test "$with_database_berkdb" != "no"; then
   echo $ac_n "checking for Berkeley db.h""... $ac_c" 1>&6
-echo "configure:11058: checking for Berkeley db.h" >&5
+echo "configure:10781: checking for Berkeley db.h" >&5
   for path in "db/db.h" "db.h"; do
     cat > conftest.$ac_ext <<EOF
-#line 11061 "configure"
+#line 10784 "configure"
 #include "confdefs.h"
 #ifdef HAVE_INTTYPES_H
 #define __BIT_TYPES_DEFINED__
@@ -11075,7 +10798,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:11079: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   db_h_path="$path"; break
 else
@@ -11084,16 +10807,16 @@ else
 fi
 rm -f conftest*
   done
-  if test -z "$db_h_path"
+  if test -z "$db_h_path" 
   then echo "$ac_t""no" 1>&6; with_database_berkdb=no
   else echo "$ac_t""$db_h_path" 1>&6
   fi
 
   if test "$with_database_berkdb" != "no"; then
     echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6
-echo "configure:11095: checking for Berkeley DB version" >&5
+echo "configure:10818: checking for Berkeley DB version" >&5
     cat > conftest.$ac_ext <<EOF
-#line 11097 "configure"
+#line 10820 "configure"
 #include "confdefs.h"
 #include <$db_h_path>
 #if DB_VERSION_MAJOR > 1
 rm -f conftest*
 
     echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6
-echo "configure:11116: checking for $dbfunc" >&5
+echo "configure:10839: checking for $dbfunc" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11119 "configure"
+#line 10842 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $dbfunc(); below.  */
@@ -11138,7 +10861,7 @@ $dbfunc();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10865: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$dbfunc=yes"
 else
@@ -11157,12 +10880,12 @@ else
 
     
 echo $ac_n "checking for $dbfunc in -ldb""... $ac_c" 1>&6
-echo "configure:11161: checking for $dbfunc in -ldb" >&5
+echo "configure:10884: checking for $dbfunc in -ldb" >&5
 ac_lib_var=`echo db'_'$dbfunc | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldb "
 cat > conftest.$ac_ext <<EOF
-#line 11166 "configure"
+#line 10889 "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
@@ -11173,7 +10896,7 @@ int main() {
 $dbfunc()
 ; return 0; }
 EOF
-if { (eval echo configure:11177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 if test "$with_socks" = "yes"; then
   
 echo $ac_n "checking for SOCKSinit in -lsocks""... $ac_c" 1>&6
-echo "configure:11241: checking for SOCKSinit in -lsocks" >&5
+echo "configure:10964: checking for SOCKSinit in -lsocks" >&5
 ac_lib_var=`echo socks'_'SOCKSinit | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lsocks "
 cat > conftest.$ac_ext <<EOF
-#line 11246 "configure"
+#line 10969 "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
@@ -11253,7 +10976,7 @@ int main() {
 SOCKSinit()
 ; return 0; }
 EOF
-if { (eval echo configure:11257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:10980: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -11310,15 +11033,15 @@ for ac_hdr in dlfcn.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:11314: checking for $ac_hdr" >&5
+echo "configure:11037: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11317 "configure"
+#line 11040 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11045: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11349,12 +11072,12 @@ done
 
 test -z "$with_shlib" && test ! -z "$have_dlfcn" && { 
 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:11353: checking for dlopen in -ldl" >&5
+echo "configure:11076: checking for dlopen in -ldl" >&5
 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldl "
 cat > conftest.$ac_ext <<EOF
-#line 11358 "configure"
+#line 11081 "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
@@ -11365,7 +11088,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:11369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11092: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
  }
 test -z "$with_shlib" && test ! -z "$have_dlfcn" && { 
 echo $ac_n "checking for _dlopen in -lc""... $ac_c" 1>&6
-echo "configure:11398: checking for _dlopen in -lc" >&5
+echo "configure:11121: checking for _dlopen in -lc" >&5
 ac_lib_var=`echo c'_'_dlopen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lc "
 cat > conftest.$ac_ext <<EOF
-#line 11403 "configure"
+#line 11126 "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
@@ -11410,7 +11133,7 @@ int main() {
 _dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:11414: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11137: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
  }
 test -z "$with_shlib" && test ! -z "$have_dlfcn" && { 
 echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6
-echo "configure:11443: checking for dlopen in -lc" >&5
+echo "configure:11166: checking for dlopen in -lc" >&5
 ac_lib_var=`echo c'_'dlopen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lc "
 cat > conftest.$ac_ext <<EOF
-#line 11448 "configure"
+#line 11171 "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
@@ -11455,7 +11178,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:11459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
  }
 test -z "$with_shlib" && { 
 echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "configure:11488: checking for shl_load in -ldld" >&5
+echo "configure:11211: checking for shl_load in -ldld" >&5
 ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 11493 "configure"
+#line 11216 "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
@@ -11500,7 +11223,7 @@ int main() {
 shl_load()
 ; return 0; }
 EOF
-if { (eval echo configure:11504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11227: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
  }
 test -z "$with_shlib" && { 
 echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6
-echo "configure:11533: checking for dld_init in -ldld" >&5
+echo "configure:11256: checking for dld_init in -ldld" >&5
 ac_lib_var=`echo dld'_'dld_init | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 11538 "configure"
+#line 11261 "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
@@ -11545,7 +11268,7 @@ int main() {
 dld_init()
 ; return 0; }
 EOF
-if { (eval echo configure:11549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -11595,7 +11318,7 @@ dll_cflags="-r"
 dll_oflags="-o "
 
 echo $ac_n "checking how to build a shared library""... $ac_c" 1>&6
-echo "configure:11599: checking how to build a shared library" >&5
+echo "configure:11322: checking how to build a shared library" >&5
 case `uname -rs` in
        UNIX_SV*|UNIX_System_V*)
                dll_lflags="-G"
@@ -11686,10 +11409,10 @@ case `uname -rs` in
   for ac_func in dlerror
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:11690: checking for $ac_func" >&5
+echo "configure:11413: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11693 "configure"
+#line 11416 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -11712,7 +11435,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11716: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:11439: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -11748,15 +11471,14 @@ done
 fi
 
 cat > conftest.$ac_ext <<EOF
-#line 11752 "configure"
+#line 11475 "configure"
 #include "confdefs.h"
 int main(int c,char *v[]){return 0;}
 EOF
-if { (eval echo configure:11756: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11479: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>&5
 then
   :
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&5
   cat conftest.$ac_ext >&5
   rm -fr conftest*
@@ -11893,7 +11615,7 @@ if test -f $srcdir/src/gdbinit -a ! -f src/gdbinit ; then
   echo "source $srcdir/src/gdbinit" > src/gdbinit
 fi
 
-if test "$__SUNPRO_C" = "yes"; then
+if test "$__sunpro_c" = "yes"; then
   echo "creating .sbinit"; echo ""
   ( echo "# For use with Sun WorkShop's Source browser."
     echo "# See sbquery(1) and sbinit(4) for more information"
@@ -12313,31 +12035,15 @@ if test "$with_xpm" = yes; then
 elif test "$with_x11" = yes; then
   echo "  --------------------------------------------------------------------"
   echo "  WARNING: Compiling without XPM support."
-  if test "$xpm_problem" != ""; then
-    echo "  Reason: $xpm_problem"
-  fi
-  echo "  WARNING: You should strongly consider installing XPM."
+  echo "  WARNING: You should strongly considering installing XPM."
   echo "  WARNING: Otherwise toolbars and other graphics will look suboptimal."
-  echo "  WARNING: (a copy may be found in ftp://ftp.xemacs.org/pub/xemacs/aux)"
-  echo "  --------------------------------------------------------------------"
-fi
-if test "$with_png" = yes; then
-  echo "  Compiling in support for PNG image handling."
-elif test "$window_system" != "none"; then
-  echo "  --------------------------------------------------------------------"
-  echo "  WARNING: Compiling without PNG image support."
-  if test "$png_problem" != ""; then
-    echo "  Reason: $png_problem"
-  fi
-  echo "  WARNING: You should strongly consider installing the PNG libraries."
-  echo "  WARNING: Otherwise certain images and glyphs may not display."
-  echo "  WARNING: (a copy may be found in ftp://ftp.xemacs.org/pub/xemacs/aux)"
   echo "  --------------------------------------------------------------------"
 fi
-test "$with_gif"   = yes && echo "  Compiling in support for (builtin) GIF image handling."
-test "$with_jpeg"  = yes && echo "  Compiling in support for JPEG image handling."
-test "$with_tiff"  = yes && echo "  Compiling in support for TIFF image handling."
 test "$with_xface" = yes && echo "  Compiling in support for X-Face message headers."
+test "$with_gif"   = yes && echo "  Compiling in support for GIF image conversion."
+test "$with_jpeg"  = yes && echo "  Compiling in support for JPEG image conversion."
+test "$with_png"   = yes && echo "  Compiling in support for PNG image conversion."
+test "$with_tiff"  = yes && echo "  Compiling in support for TIFF image conversion."
 case "$with_sound" in
   nas    ) echo "  Compiling in network sound (NAS) support." ;;
   native ) echo "  Compiling in native sound support." ;;
index fc963ae..3044365 100644 (file)
@@ -79,12 +79,11 @@ define([AC_TRY_RUN_NATIVE],
 #include "confdefs.h"
 [$1]
 EOF
-if AC_TRY_EVAL(ac_link) && test -s conftest && (./conftest; exit $?) 2>&AC_FD_CC
+if AC_TRY_EVAL(ac_link) && test -s conftest && (./conftest; exit) 2>&AC_FD_CC
 then
 dnl Do not remove the temporary files here, so they can be examined.
   ifelse([$2], , :, [$2])
 else
-  conftest_rc="$?"
   echo "configure: failed program was:" >&AC_FD_CC
   cat conftest.$ac_ext >&AC_FD_CC
 ifelse([$3], , , [  rm -fr conftest*
@@ -1020,7 +1019,7 @@ machine='' opsys=''
 dnl Straightforward machine determination
 case "$canonical" in
   sparc-*-*        ) machine=sparc ;;
-  alpha*-*-*       ) machine=alpha ;;
+  alpha-*-*        ) machine=alpha ;;
   vax-*-*          ) machine=vax ;;
   mips-dec-*       ) machine=pmax ;;
   mips-sgi-*       ) machine=iris4d ;;
@@ -1059,9 +1058,9 @@ case "$canonical" in
   *-*-aix3.1*  ) opsys=aix3-1  ;;
   *-*-aix3.2.5 ) opsys=aix3-2-5        ;;
   *-*-aix3*    ) opsys=aix3-2  ;;
-  *-*-aix4.0*  ) opsys=aix4    ;;
+  *-*-aix4.2*  ) opsys=aix4-2  ;;
   *-*-aix4.1*  ) opsys=aix4-1  ;;
-  *-*-aix4*    ) opsys=aix4-2  ;;
+  *-*-aix4*    ) opsys=aix4    ;;
 
   dnl Other generic OSes
   *-gnu* )                     opsys=gnu    ;;
@@ -1595,24 +1594,13 @@ dnl I'm tired of pop being broken with GLIBC -slb
 dnl Well. then why not fix fucking pop?
 test "$have_glibc" = "yes" && AC_DEFINE(_GNU_SOURCE)
 
-
-dnl Identify compilers to enable compiler-specific hacks.
-dnl Add support for other compilers HERE!
-dnl GCC is already identified elsewhere.
-AC_TRY_RUN([int main () {
-#if defined __SUNPRO_C
-return 11;
-#elif defined __DECC
-return 12;
-#else
-return 0;
+AC_MSG_CHECKING(whether we are using SunPro C)
+AC_TRY_COMPILE([],[#ifndef __SUNPRO_C
+#error Not a  SunPro compiler :-(
+******* ======= ******** &&&&&&&&
 #endif
-}], [],
-[case "$conftest_rc" in
-  11) echo "You appear to be using the SunPro C compiler."; __SUNPRO_C=yes ;;
-  12) echo "You appear to be using the DEC C compiler."   ; __DECC=yes ;;
-esac])
-
+], __sunpro_c=yes, __sunpro_c=no)
+AC_MSG_RESULT($__sunpro_c)
 
 dnl case "$canonical" in
 dnl   *-sun-sunos* ) test "$CPP" = "acc -E" && CPP="acc -E -Xs" ;;
@@ -1738,10 +1726,6 @@ test "$extra_verbose" = "yes" && \
 dnl Non-ordinary link usually requires -lc
 test "$ordinary_link" = "no" -a -z "$libs_standard" && libs_standard="-lc"
 
-dnl Compiler-specific hacks
-dnl DEC C requires -std
-test "$__DECC" = "yes" && XE_APPEND(-std, c_switch_site)
-
 dnl Calculalate value of CFLAGS:
 dnl Use either command line flag, environment var, or autodetection
 if test "$cflags_specified" = "no"; then
@@ -1755,17 +1739,15 @@ if test "$cflags_specified" = "no"; then
     dnl cygwin can't cope with -O3
     test "$opsys $machine" = "cygwin32 intel386" && \
       CFLAGS="-g -O2 -Wall -Wno-switch"
-  elif test "$__SUNPRO_C" = "yes"; then
+  elif test "$__sunpro_c" = "yes"; then
     case "$opsys" in
       sol2    ) CFLAGS="-v -xO4" ;;
       sunos4* ) CFLAGS="-xO2";;
     esac
-  elif test "$__DECC" = "yes"; then
-    CFLAGS="-O3"
   elif test "$CC" = "xlc"; then
-    CFLAGS="-g -O3 -qstrict -qnoansialias -qlibansi -qinfo -qro -qmaxmem=20000"
-  dnl ### Add optimal CFLAGS support for other compilers HERE!
+    CFLAGS="-O3 -qstrict -qnoansialias -qlibansi -qinfo -qro -qmaxmem=20000"
   else
+    dnl ### Add tests for other compilers here...
     CFLAGS="-O" ;dnl The only POSIX-approved flag
   fi
 fi
@@ -1907,7 +1889,7 @@ dnl -------------------------------------
 if   test "$dynamic" = "no"; then add_runtime_path=no
 elif test -n "$LD_RUN_PATH"; then add_runtime_path=yes
 else case "$opsys" in
-       sol2 | irix* | *bsd* | decosf* ) add_runtime_path=yes ;;
+       sol2 | irix* | *bsd* ) add_runtime_path=yes ;;
        * ) add_runtime_path=no ;;
      esac
 fi
@@ -1916,19 +1898,14 @@ if test "$add_runtime_path" = "yes"; then
   dnl Try to autodetect runtime library flag (usually -R),
   dnl and whether it works (or at least does no harm)
   AC_MSG_CHECKING("for runtime libraries flag")
-  case "$opsys" in
-    sol2 ) dash_r = "-R" ;;
-    decosf* | linux* ) dash_r = "-rpath " ;;
-    *)
-      dash_r=""
-      for try_dash_r in "-R" "-R " "-rpath "; do
-        xe_check_libs="${try_dash_r}/no/such/file-or-directory"
-        XE_PROTECT_LINKER_FLAGS(xe_check_libs)
-        AC_TRY_LINK(, , dash_r="$try_dash_r")
-        xe_check_libs=""
-        test -n "$dash_r" && break
-      done ;;
-  esac
+  dash_r=""
+  for try_dash_r in "-R" "-R " "-rpath "; do
+    xe_check_libs="${try_dash_r}/no/such/file-or-directory"
+    XE_PROTECT_LINKER_FLAGS(xe_check_libs)
+    AC_TRY_LINK(, , dash_r="$try_dash_r")
+    xe_check_libs=""
+    test -n "$dash_r" && break
+  done
   if test -n "$dash_r";
     then AC_MSG_RESULT("\"${dash_r}\"")
     else AC_MSG_RESULT(NONE)
@@ -2081,7 +2058,7 @@ AC_PROG_YACC
 
 dnl checks for header files
 AC_CHECK_HEADERS(mach/mach.h sys/stropts.h sys/timeb.h sys/time.h unistd.h)
-AC_CHECK_HEADERS(utime.h locale.h libgen.h fcntl.h ulimit.h cygwin32/version.h)
+AC_CHECK_HEADERS(utime.h locale.h libgen.h fcntl.h ulimit.h)
 AC_CHECK_HEADERS(linux/version.h kstat.h sys/pstat.h inttypes.h sys/un.h a.out.h)
 AC_HEADER_SYS_WAIT
 AC_HEADER_STDC
@@ -2304,9 +2281,6 @@ if test "$with_x11" = "yes"; then
     fi
   done
 
-  dnl Avoid version mismatch for shared library libXm.so on osf4
-  if test "$GCC" = yes -a -d /usr/shlib; then XE_APPEND(-L/usr/shlib, X_LIBS); fi
-
   ld_switch_x_site="$X_LIBS"
 
   XE_COMPUTE_RUNPATH()
@@ -2677,7 +2651,6 @@ if test "$window_system" != "none"; then
   AC_CHECKING(for graphics libraries)
 
   dnl Autodetect Xpm
-  xpm_problem=""
   if test -z "$with_xpm"; then
     AC_MSG_CHECKING(for Xpm - no older than 3.4f)
     xe_check_libs=-lXpm
@@ -2687,22 +2660,22 @@ if test "$window_system" != "none"; then
       XpmIncludeVersion != XpmLibraryVersion() ? 1 :
       XpmIncludeVersion < 30406 ? 2 : 0 ;}],
     [./conftest dummy_arg; xpm_status=$?;
-      if test "$xpm_status" = "0"; then
+      if test "$?" = "0"; then
         with_xpm=yes;
       else
         with_xpm=no;
-        if test "$xpm_status" = "1"; then
+        if test "$?" = "1"; then
           xpm_problem="Xpm library version and header file version don't match!"
-        elif test "$xpm_status" = "2"; then
+        elif test "$?" = "2"; then
           xpm_problem="Xpm library version is too old!"
         else
           xpm_problem="Internal xpm detection logic error!"
         fi
         echo "
-*** WARNING *** $xpm_problem
+*** WARNING *** $problem
   I'm not touching that with a 10-foot pole!
   If you really want to use the installed version of Xpm, rerun
-  configure and add '--with-xpm=yes', but don't blame me if XEmacs crashes!"
+  configure --with-xpm=yes, but don't blame me if XEmacs crashes!"
     fi],
     [with_xpm=no])
     xe_check_libs=
@@ -2723,15 +2696,6 @@ if test "$window_system" != "none"; then
     fi
   fi
 
-  dnl For a brief period we had the GIF code split out into a separate library,
-  dnl but patent problems, etc. sort of squashed that idea.
-  dnl We default to building with builtin GIF decoding
-  if test "$with_gif" != "no"; then
-    with_gif="yes"
-    AC_DEFINE(HAVE_GIF)
-    XE_ADD_OBJS(dgif_lib.o gif_io.o)
-  fi
-
   dnl Too many stupid linkers can't detect cascaded lib dependencies until runtime
   dnl So we always search for libz compression support.
   if test "$with_png $with_tiff" != "no no"; then
@@ -2740,6 +2704,16 @@ if test "$window_system" != "none"; then
     AC_CHECK_LIB(gz, inflate, [XE_PREPEND(-lgz, libs_x)])])])
   fi
 
+  dnl Autodetect GIFlib
+  AC_MSG_CHECKING(for gifreader)
+  test -z "$with_gif" && { AC_CHECK_HEADER(gifrlib.h,        ,with_gif=no) }
+  test -z "$with_gif" && { AC_CHECK_LIB(gifreader, GetGifError,[:] ,with_gif=no) }
+  test -z "$with_gif" && with_gif=yes
+  if test "$with_gif" = "yes"; then
+    AC_DEFINE(HAVE_GIF)
+    XE_PREPEND(-lgifreader, libs_x)
+  fi
+
   dnl autodetect JPEG
   test -z "$with_jpeg" && { AC_CHECK_HEADER(jpeglib.h,                    ,with_jpeg=no) }
   test -z "$with_jpeg" && { AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,[:],with_jpeg=no) }
@@ -2750,38 +2724,18 @@ if test "$window_system" != "none"; then
   fi
 
   dnl autodetect PNG
-  png_problem=""
-  test -z "$with_png" && { AC_CHECK_FUNC(pow,                  ,with_png=no) }
-  test -z "$with_png" && { AC_CHECK_HEADER(png.h,              ,with_png=no) }
-  test -z "$with_png" && { AC_CHECK_LIB(png, png_read_image,[:],with_png=no) }
   if test -z "$with_png"; then
-    AC_MSG_CHECKING(for workable png version information)
-    xe_check_libs="-lpng -lz"
-    AC_TRY_RUN([#include <png.h>
-    int main(int c, char **v) {
-    if (c == 1) return 0;
-    if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING) != 0) return 1;
-    return (PNG_LIBPNG_VER < 10002) ? 2 : 0 ;}],
-    [./conftest dummy_arg; png_status=$?;
-      if test "$png_status" = "0"; then
-       with_png=yes;
-      else
-       with_png=no;
-       if test "$png_status" = "1"; then
-         png_problem="PNG library version and header file don't match!"
-        elif test "$png_status" = "2"; then
-         png_problem="PNG library version too old (pre 1.0.2)!"
-       fi
-       echo "
-*** WARNING *** $png_problem
-  I'm not touching that with a 10-foot pole!
-  If you really want to use the installed version of libPNG, rerun
-  configure and add '--with-png=yes', but don't blame me if XEmacs crashes!"
-    fi],
-    [with_png=no])
-    xe_check_libs=
-    AC_MSG_RESULT($with_png)
+    AC_MSG_CHECKING(for png.h - no older than 0.96)
+    AC_EGREP_CPP(yes,
+[#include <png.h>
+#if PNG_LIBPNG_VER >= 96
+yes
+#endif
+], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no); with_png=no])
   fi
+  test -z "$with_png" && { AC_CHECK_FUNC(pow,                  ,with_png=no) }
+  test -z "$with_png" && { AC_CHECK_LIB(png, png_read_image,[:],with_png=no) }
+  test -z "$with_png" && with_png=yes
   if test "$with_png" = "yes"; then
     AC_DEFINE(HAVE_PNG)
     XE_PREPEND(-lpng, libs_x)
@@ -2798,7 +2752,7 @@ if test "$window_system" != "none"; then
 fi
 
 dnl ----------------------
-dnl X-Specific Graphics libraries
+dnl Graphics libraries
 dnl ----------------------
 
 if test "$with_x11" = "yes"; then
@@ -3227,7 +3181,6 @@ int main (int argc, char *argv[])
 esac
 AC_MSG_RESULT($have_mmap)
 test "$have_mmap" = "yes" && AC_DEFINE(HAVE_MMAP)
-AC_FUNC_MMAP
 
 dnl rel_alloc requires either GNU malloc or system malloc with mmap
 dnl We only turn rel_alloc on by default if mmap is available.
@@ -3514,7 +3467,7 @@ typedef uint64_t u_int64_t;
 #include <$path>
 ],[], db_h_path="$path"; break)
   done
-  if test -z "$db_h_path"
+  if test -z "$db_h_path" 
   then AC_MSG_RESULT(no); with_database_berkdb=no
   else AC_MSG_RESULT($db_h_path)
   fi
@@ -3670,7 +3623,7 @@ if test -f $srcdir/src/gdbinit -a ! -f src/gdbinit ; then
 fi
 
 dnl Create top level .sbinit for Sun compilers
-if test "$__SUNPRO_C" = "yes"; then
+if test "$__sunpro_c" = "yes"; then
   echo "creating .sbinit"; echo ""
   ( echo "# For use with Sun WorkShop's Source browser."
     echo "# See sbquery(1) and sbinit(4) for more information"
@@ -3946,31 +3899,15 @@ if test "$with_xpm" = yes; then
 elif test "$with_x11" = yes; then
   echo "  --------------------------------------------------------------------"
   echo "  WARNING: Compiling without XPM support."
-  if test "$xpm_problem" != ""; then
-    echo "  Reason: $xpm_problem"
-  fi
-  echo "  WARNING: You should strongly consider installing XPM."
+  echo "  WARNING: You should strongly considering installing XPM."
   echo "  WARNING: Otherwise toolbars and other graphics will look suboptimal."
-  echo "  WARNING: (a copy may be found in ftp://ftp.xemacs.org/pub/xemacs/aux)"
-  echo "  --------------------------------------------------------------------"
-fi
-if test "$with_png" = yes; then
-  echo "  Compiling in support for PNG image handling."
-elif test "$window_system" != "none"; then
-  echo "  --------------------------------------------------------------------"
-  echo "  WARNING: Compiling without PNG image support."
-  if test "$png_problem" != ""; then
-    echo "  Reason: $png_problem"
-  fi
-  echo "  WARNING: You should strongly consider installing the PNG libraries."
-  echo "  WARNING: Otherwise certain images and glyphs may not display."
-  echo "  WARNING: (a copy may be found in ftp://ftp.xemacs.org/pub/xemacs/aux)"
   echo "  --------------------------------------------------------------------"
 fi
-test "$with_gif"   = yes && echo "  Compiling in support for (builtin) GIF image handling."
-test "$with_jpeg"  = yes && echo "  Compiling in support for JPEG image handling."
-test "$with_tiff"  = yes && echo "  Compiling in support for TIFF image handling."
 test "$with_xface" = yes && echo "  Compiling in support for X-Face message headers."
+test "$with_gif"   = yes && echo "  Compiling in support for GIF image conversion."
+test "$with_jpeg"  = yes && echo "  Compiling in support for JPEG image conversion."
+test "$with_png"   = yes && echo "  Compiling in support for PNG image conversion."
+test "$with_tiff"  = yes && echo "  Compiling in support for TIFF image conversion."
 case "$with_sound" in
   nas    ) echo "  Compiling in network sound (NAS) support." ;;
   native ) echo "  Compiling in native sound support." ;;
diff --git a/etc/sample.emacs b/etc/sample.emacs
new file mode 100644 (file)
index 0000000..9e14814
--- /dev/null
@@ -0,0 +1,656 @@
+;; -*- Mode: Emacs-Lisp -*-
+
+;;; This is a sample .emacs file.
+;;;
+;;; The .emacs file, which should reside in your home directory, allows you to
+;;; customize the behavior of Emacs.  In general, changes to your .emacs file
+;;; will not take effect until the next time you start up Emacs.  You can load
+;;; it explicitly with `M-x load-file RET ~/.emacs RET'.
+;;;
+;;; There is a great deal of documentation on customization in the Emacs
+;;; manual.  You can read this manual with the online Info browser: type
+;;; `C-h i' or select "Emacs Info" from the "Help" menu.
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;                     Basic Customization                         ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Enable the command `narrow-to-region' ("C-x n n"), a useful
+;; command, but possibly confusing to a new user, so it's disabled by
+;; default.
+(put 'narrow-to-region 'disabled nil)
+
+;;; Define a variable to indicate whether we're running XEmacs/Lucid Emacs.
+;;; (You do not have to defvar a global variable before using it --
+;;; you can just call `setq' directly like we do for `emacs-major-version'
+;;; below.  It's clearer this way, though.)
+
+(defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version))
+
+;; Make the sequence "C-x w" execute the `what-line' command, 
+;; which prints the current line number in the echo area.
+(global-set-key "\C-xw" 'what-line)
+
+;; set up the function keys to do common tasks to reduce Emacs pinky
+;; and such.
+
+;; Make F1 invoke help
+(global-set-key [f1] 'help-command)
+;; Make F2 be `undo'
+(global-set-key [f2] 'undo)
+;; Make F3 be `find-file'
+;; Note: it does not currently work to say
+;;   (global-set-key 'f3 "\C-x\C-f")
+;; The reason is that macros can't do interactive things properly.
+;; This is an extremely longstanding bug in Emacs.  Eventually,
+;; it will be fixed. (Hopefully ..)
+(global-set-key [f3] 'find-file)
+
+;; Make F4 be "mark", F5 be "copy", F6 be "paste"
+;; Note that you can set a key sequence either to a command or to another
+;; key sequence.
+(global-set-key [f4] 'set-mark-command)
+(global-set-key [f5] "\M-w")
+(global-set-key [f6] "\C-y")
+
+;; Shift-F4 is "pop mark off of stack"
+(global-set-key [(shift f4)] (lambda () (interactive) (set-mark-command t)))
+
+;; Make F7 be `save-buffer'
+(global-set-key [f7] 'save-buffer)
+
+;; Make F8 be "start macro", F9 be "end macro", F10 be "execute macro"
+(global-set-key [f8] 'start-kbd-macro)
+(global-set-key [f9] 'end-kbd-macro)
+(global-set-key [f10] 'call-last-kbd-macro)
+
+;; Here's an alternative binding if you don't use keyboard macros:
+;; Make F8 be `save-buffer' followed by `delete-window'.
+;;(global-set-key 'f8 "\C-x\C-s\C-x0")
+
+;; If you prefer delete to actually delete forward then you want to
+;; uncomment the next line (or use `Customize' to customize this).
+;; (setq delete-key-deletes-forward t)
+
+
+(cond (running-xemacs
+       ;;
+       ;; Code for any version of XEmacs/Lucid Emacs goes here
+       ;;
+
+       ;; Change the values of some variables.
+       ;; (t means true; nil means false.)
+       ;;
+       ;; Use the "Describe Variable..." option on the "Help" menu
+       ;; to find out what these variables mean.
+       (setq find-file-use-truenames nil
+            find-file-compare-truenames t
+            minibuffer-confirm-incomplete t
+            complex-buffers-menu-p t
+            next-line-add-newlines nil
+            mail-yank-prefix "> "
+            kill-whole-line t
+            )
+
+       ;; When running ispell, consider all 1-3 character words as correct.
+       (setq ispell-extra-args '("-W" "3"))
+
+       (cond ((or (not (fboundp 'device-type))
+                 (equal (device-type) 'x))
+             ;; Code which applies only when running emacs under X goes here.
+             ;; (We check whether the function `device-type' exists
+             ;; before using it.  In versions before 19.12, there
+             ;; was no such function.  If it doesn't exist, we
+             ;; simply assume we're running under X -- versions before
+             ;; 19.12 only supported X.)
+
+             ;; Remove the binding of C-x C-c, which normally exits emacs.
+             ;; It's easy to hit this by mistake, and that can be annoying.
+             ;; Under X, you can always quit with the "Exit Emacs" option on
+             ;; the File menu.
+             (global-set-key "\C-x\C-c" nil)
+
+             ;; Uncomment this to enable "sticky modifier keys" in 19.13
+             ;; and up.  With sticky modifier keys enabled, you can
+             ;; press and release a modifier key before pressing the
+             ;; key to be modified, like how the ESC key works always.
+             ;; If you hold the modifier key down, however, you still
+             ;; get the standard behavior.  I personally think this
+             ;; is the best thing since sliced bread (and a *major*
+             ;; win when it comes to reducing Emacs pinky), but it's
+             ;; disorienting at first so I'm not enabling it here by
+             ;; default.
+
+             ;;(setq modifier-keys-are-sticky t)
+
+             ;; This changes the variable which controls the text that goes
+             ;; in the top window title bar.  (However, it is not changed
+             ;; unless it currently has the default value, to avoid
+             ;; interfering with a -wn command line argument I may have
+             ;; started emacs with.)
+             (if (equal frame-title-format "%S: %b")
+                 (setq frame-title-format
+                       (concat "%S: " invocation-directory invocation-name
+                               " [" emacs-version "]"
+                               (if nil ; (getenv "NCD")
+                                   ""
+                                 "   %b"))))
+
+             ;; If we're running on display 0, load some nifty sounds that
+             ;; will replace the default beep.  But if we're running on a
+             ;; display other than 0, which probably means my NCD X terminal,
+             ;; which can't play digitized sounds, do two things: reduce the
+             ;; beep volume a bit, and change the pitch of the sound that is
+             ;; made for "no completions."
+             ;;
+             ;; (Note that sampled sounds only work if XEmacs was compiled
+             ;; with sound support, and we're running on the console of a
+             ;; Sparc, HP, or SGI machine, or on a machine which has a
+             ;; NetAudio server; otherwise, you just get the standard beep.)
+             ;;
+             ;; (Note further that changing the pitch and duration of the
+             ;; standard beep only works with some X servers; many servers
+             ;; completely ignore those parameters.)
+             ;;
+             (cond ((string-match ":0" (getenv "DISPLAY"))
+                    (load-default-sounds))
+                   (t
+                    (setq bell-volume 40)
+                    (setq sound-alist
+                          (append sound-alist '((no-completion :pitch 500))))
+                    ))
+
+             ;; Make `C-x C-m' and `C-x RET' be different (since I tend
+             ;; to type the latter by accident sometimes.)
+             (define-key global-map [(control x) return] nil)
+
+             ;; Change the pointer used when the mouse is over a modeline
+             (set-glyph-image modeline-pointer-glyph "leftbutton")
+
+             ;; Change the continuation glyph face so it stands out more
+             (and (fboundp 'set-glyph-property)
+                  (boundp 'continuation-glyph)
+                  (set-glyph-property continuation-glyph 'face 'bold))
+
+             ;; Change the pointer used during garbage collection.
+             ;;
+             ;; Note that this pointer image is rather large as pointers go,
+             ;; and so it won't work on some X servers (such as the MIT
+             ;; R5 Sun server) because servers may have lamentably small
+             ;; upper limits on pointer size.
+             ;;(if (featurep 'xpm)
+             ;;   (set-glyph-image gc-pointer-glyph
+             ;;         (expand-file-name "trash.xpm" data-directory)))
+
+             ;; Here's another way to do that: it first tries to load the
+             ;; pointer once and traps the error, just to see if it's
+             ;; possible to load that pointer on this system; if it is,
+             ;; then it sets gc-pointer-glyph, because we know that
+             ;; will work.  Otherwise, it doesn't change that variable
+             ;; because we know it will just cause some error messages.
+             (if (featurep 'xpm)
+                 (let ((file (expand-file-name "recycle.xpm" data-directory)))
+                   (if (condition-case error
+                           ;; check to make sure we can use the pointer.
+                           (make-image-instance file nil
+                                                '(pointer))
+                         (error nil))      ; returns nil if an error occurred.
+                       (set-glyph-image gc-pointer-glyph file))))
+
+             (when (featurep 'menubar)
+               ;; Add `dired' to the File menu
+               (add-menu-button '("File") ["Edit Directory" dired t])
+
+               ;; Here's a way to add scrollbar-like buttons to the menubar
+               (add-menu-button nil ["Top" beginning-of-buffer t])
+               (add-menu-button nil ["<<<" scroll-down         t])
+               (add-menu-button nil [" . " recenter            t])
+               (add-menu-button nil [">>>" scroll-up           t])
+               (add-menu-button nil ["Bot" end-of-buffer       t]))
+
+             ;; Change the behavior of mouse button 2 (which is normally
+             ;; bound to `mouse-yank'), so that it inserts the selected text
+             ;; at point (where the text cursor is), instead of at the
+             ;; position clicked.
+             ;;
+             ;; Note that you can find out what a particular key sequence or
+             ;; mouse button does by using the "Describe Key..." option on
+             ;; the Help menu.
+             (setq mouse-yank-at-point t)
+
+             ;; When editing C code (and Lisp code and the like), I often
+             ;; like to insert tabs into comments and such.  It gets to be
+             ;; a pain to always have to use `C-q TAB', so I set up a more
+             ;; convenient binding.  Note that this does not work in
+             ;; TTY frames, where tab and shift-tab are indistinguishable.
+             (define-key global-map '(shift tab) 'self-insert-command)
+
+             ;; LISPM bindings of Control-Shift-C and Control-Shift-E.
+             ;; Note that "\C-C" means Control-C, not Control-Shift-C.
+             ;; To specify shifted control characters, you must use the
+             ;; more verbose syntax used here.
+             (define-key emacs-lisp-mode-map '(control C) 'compile-defun)
+             (define-key emacs-lisp-mode-map '(control E) 'eval-defun)
+
+             ;; If you like the FSF Emacs binding of button3 (single-click
+             ;; extends the selection, double-click kills the selection),
+             ;; uncomment the following:
+
+             ;; Under 19.13, the following is enough:
+              ;(define-key global-map 'button3 'mouse-track-adjust)
+
+             ;; But under 19.12, you need this:
+              ;(define-key global-map 'button3
+              ;    (lambda (event)
+              ;      (interactive "e")
+              ;      (let ((default-mouse-track-adjust t))
+              ;        (mouse-track event))))
+
+             ;; Under both 19.12 and 19.13, you also need this:
+              ;(add-hook 'mouse-track-click-hook
+              ;          (lambda (event count)
+              ;            (if (or (/= (event-button event) 3)
+              ;                    (/= count 2))
+              ;                nil ;; do the normal operation
+              ;              (kill-region (point) (mark))
+              ;              t ;; don't do the normal operations.
+              ;              )))
+
+             ))
+
+       ))
+
+;; Oh, and here's a cute hack you might want to put in the sample .emacs
+;; file: it changes the color of the window if it's not on the local
+;; machine, or if it's running as root:
+
+;; local emacs background:  whitesmoke
+;; remote emacs background: palegreen1
+;; root emacs background:   coral2
+(cond
+ ((and (string-match "XEmacs" emacs-version)
+       (eq window-system 'x)
+       (boundp 'emacs-major-version)
+       (= emacs-major-version 19)
+       (>= emacs-minor-version 12))
+  (let* ((root-p (eq 0 (user-uid)))
+        (dpy (or (getenv "DISPLAY") ""))
+        (remote-p (not
+                   (or (string-match "^\\(\\|unix\\|localhost\\):" dpy)
+                       (let ((s (system-name)))
+                         (if (string-match "\\.\\(netscape\\|mcom\\)\\.com" s)
+                             (setq s (substring s 0 (match-beginning 0))))
+                         (string-match (concat "^" (regexp-quote s)) dpy)))))
+        (bg (cond (root-p "coral2")
+                  (remote-p "palegreen1")
+                  (t nil))))
+    (cond (bg
+          (let ((def (color-name (face-background 'default)))
+                (faces (face-list)))
+            (while faces
+              (let ((obg (face-background (car faces))))
+                (if (and obg (equal def (color-name obg)))
+                    (set-face-background (car faces) bg)))
+              (setq faces (cdr faces)))))))))
+
+
+;;; Older versions of emacs did not have these variables
+;;; (emacs-major-version and emacs-minor-version.)
+;;; Let's define them if they're not around, since they make
+;;; it much easier to conditionalize on the emacs version.
+
+(if (and (not (boundp 'emacs-major-version))
+        (string-match "^[0-9]+" emacs-version))
+    (setq emacs-major-version
+         (string-to-int (substring emacs-version
+                                   (match-beginning 0) (match-end 0)))))
+(if (and (not (boundp 'emacs-minor-version))
+        (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version))
+    (setq emacs-minor-version
+         (string-to-int (substring emacs-version
+                                   (match-beginning 1) (match-end 1)))))
+
+;;; Define a function to make it easier to check which version we're
+;;; running.
+
+(defun running-emacs-version-or-newer (major minor)
+  (or (> emacs-major-version major)
+      (and (= emacs-major-version major)
+          (>= emacs-minor-version minor))))
+
+(cond ((and running-xemacs
+           (running-emacs-version-or-newer 19 6))
+       ;;
+       ;; Code requiring XEmacs/Lucid Emacs version 19.6 or newer goes here
+       ;;
+       ))
+
+(cond ((>= emacs-major-version 19)
+       ;;
+       ;; Code for any vintage-19 emacs goes here
+       ;;
+       ))
+
+(cond ((and (not running-xemacs)
+           (>= emacs-major-version 19))
+       ;;
+       ;; Code specific to FSF Emacs 19 (not XEmacs/Lucid Emacs) goes here
+       ;;
+       ))
+
+(cond ((< emacs-major-version 19)
+       ;;
+       ;; Code specific to emacs 18 goes here
+       ;;
+       ))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;             Customization of Specific Packages                  ;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Load gnuserv, which will allow you to connect to XEmacs sessions
+;;; using `gnuclient'.
+
+;; If you never run more than one XEmacs at a time, you might want to
+;; always start gnuserv.  Otherwise it is preferable to specify
+;; `-f gnuserv-start' on the command line to one of the XEmacsen.
+; (gnuserv-start)
+
+
+;;; ********************
+;;; Load efs, which uses the FTP protocol as a pseudo-filesystem.
+;;; When this is loaded, the pathname syntax /user@host:/remote/path
+;;; refers to files accessible through ftp.
+;;;
+(require 'dired)
+;; compatible ange-ftp/efs initialization derived from code
+;; from John Turner <turner@lanl.gov>
+;; As of 19.15, efs is bundled instead of ange-ftp.
+;; NB: doesn't handle 20.0 properly, efs didn't appear until 20.1.
+;;
+;; The environment variable EMAIL_ADDRESS is used as the password
+;; for access to anonymous ftp sites, if it is set.  If not, one is
+;; constructed using the environment variables USER and DOMAINNAME
+;; (e.g. turner@lanl.gov), if set.
+
+(if (and running-xemacs
+        (or (> emacs-major-version 20)
+            (and (= emacs-major-version 20) (>= emacs-minor-version 1))
+            (and (= emacs-major-version 19) (>= emacs-minor-version 15))))
+    (progn
+      (message "Loading and configuring bundled packages... efs")
+      (require 'efs-auto)
+      (if (getenv "USER")
+         (setq efs-default-user (getenv "USER")))
+      (if (getenv "EMAIL_ADDRESS")
+         (setq efs-generate-anonymous-password (getenv "EMAIL_ADDRESS"))
+       (if (and (getenv "USER")
+                (getenv "DOMAINNAME"))
+           (setq efs-generate-anonymous-password
+                 (concat (getenv "USER")"@"(getenv "DOMAINNAME")))))
+      (setq efs-auto-save 1))
+  (progn
+    (message "Loading and configuring bundled packages... ange-ftp")
+    (require 'ange-ftp)
+    (if (getenv "USER")
+       (setq ange-ftp-default-user (getenv "USER")))
+    (if (getenv "EMAIL_ADDRESS")
+       (setq ange-ftp-generate-anonymous-password (getenv "EMAIL_ADDRESS"))
+      (if (and (getenv "USER")
+              (getenv "DOMAINNAME"))
+         (setq ange-ftp-generate-anonymous-password
+               (concat (getenv "USER")"@"(getenv "DOMAINNAME")))))
+    (setq ange-ftp-auto-save 1)
+    )
+  )
+
+;;; ********************
+;;; Load the default-dir.el package which installs fancy handling
+;;;  of the initial contents in the minibuffer when reading
+;;; file names.
+
+(if (and running-xemacs
+        (or (and (= emacs-major-version 20) (>= emacs-minor-version 1))
+            (and (= emacs-major-version 19) (>= emacs-minor-version 15))))
+    (require 'default-dir))
+
+;;; ********************
+;;; Load the auto-save.el package, which lets you put all of your autosave
+;;; files in one place, instead of scattering them around the file system.
+;;;
+(setq auto-save-directory (expand-file-name "~/autosave/")
+      auto-save-directory-fallback auto-save-directory
+      auto-save-hash-p nil
+      efs-auto-save t
+      efs-auto-save-remotely nil
+      ;; now that we have auto-save-timeout, let's crank this up
+      ;; for better interactive response.
+      auto-save-interval 2000
+      )
+;; We load this afterwards because it checks to make sure the
+;; auto-save-directory exists (creating it if not) when it's loaded.
+(require 'auto-save)
+
+;; This adds additional extensions which indicate files normally
+;; handled by cc-mode.
+(setq auto-mode-alist
+      (append '(("\\.C$"  . c++-mode)
+               ("\\.cc$" . c++-mode)
+               ("\\.hh$" . c++-mode)
+               ("\\.c$"  . c-mode)
+               ("\\.h$"  . c-mode))
+             auto-mode-alist))
+
+
+;;; ********************
+;;; cc-mode (the mode you're in when editing C, C++, and Objective C files)
+
+;; Tell cc-mode not to check for old-style (K&R) function declarations.
+;; This speeds up indenting a lot.
+(setq c-recognize-knr-p nil)
+
+;; Change the indentation amount to 4 spaces instead of 2.
+;; You have to do it in this complicated way because of the
+;; strange way the cc-mode initializes the value of `c-basic-offset'.
+(add-hook 'c-mode-hook (lambda () (setq c-basic-offset 4)))
+
+
+;;; ********************
+;;; Load a partial-completion mechanism, which makes minibuffer completion
+;;; search multiple words instead of just prefixes; for example, the command
+;;; `M-x byte-compile-and-load-file RET' can be abbreviated as `M-x b-c-a RET'
+;;; because there are no other commands whose first three words begin with
+;;; the letters `b', `c', and `a' respectively.
+;;;
+(load-library "completer")
+
+
+;;; ********************
+;;; Load crypt, which is a package for automatically decoding and reencoding
+;;; files by various methods - for example, you can visit a .Z or .gz file,
+;;; edit it, and have it automatically re-compressed when you save it again.
+;;; 
+(setq crypt-encryption-type 'pgp   ; default encryption mechanism
+      crypt-confirm-password t    ; make sure new passwords are correct
+      ;crypt-never-ever-decrypt t  ; if you don't encrypt anything, set this to
+                                  ; tell it not to assume that "binary" files
+                                  ; are encrypted and require a password.
+      )
+(require 'crypt)
+
+
+;;; ********************
+;;; Edebug is a source-level debugger for emacs-lisp programs.
+;;;
+(define-key emacs-lisp-mode-map "\C-xx" 'edebug-defun)
+
+
+;;; ********************
+;;; Font-Lock is a syntax-highlighting package.  When it is enabled and you
+;;; are editing a program, different parts of your program will appear in
+;;; different fonts or colors.  For example, with the code below, comments
+;;; appear in red italics, function names in function definitions appear in
+;;; blue bold, etc.  The code below will cause font-lock to automatically be
+;;; enabled when you edit C, C++, Emacs-Lisp, and many other kinds of
+;;; programs.
+;;;
+;;; The "Options" menu has some commands for controlling this as well.
+;;;
+(cond (running-xemacs
+
+       ;; If you want the default colors, you could do this:
+       ;; (setq font-lock-use-default-fonts nil)
+       ;; (setq font-lock-use-default-colors t)
+       ;; but I want to specify my own colors, so I turn off all
+       ;; default values.
+       (setq font-lock-use-default-fonts nil)
+       (setq font-lock-use-default-colors nil)
+
+       (require 'font-lock)
+
+       ;; Mess around with the faces a bit.  Note that you have
+       ;; to change the font-lock-use-default-* variables *before*
+       ;; loading font-lock, and wait till *after* loading font-lock
+       ;; to customize the faces.
+
+       ;; string face is green
+       (set-face-foreground 'font-lock-string-face "forest green")
+
+       ;; comments are italic and red; doc strings are italic
+       ;;
+       ;; (I use copy-face instead of make-face-italic/make-face-bold
+       ;; because the startup code does intelligent things to the
+       ;; 'italic and 'bold faces to ensure that they are different
+       ;; from the default face.  For example, if the default face
+       ;; is bold, then the 'bold face will be unbold.)
+       (copy-face 'italic 'font-lock-comment-face)
+       ;; Underlining comments looks terrible on tty's
+       (set-face-underline-p 'font-lock-comment-face nil 'global 'tty)
+       (set-face-highlight-p 'font-lock-comment-face t 'global 'tty)
+       (copy-face 'font-lock-comment-face 'font-lock-doc-string-face)
+       (set-face-foreground 'font-lock-comment-face "red")
+
+       ;; function names are bold and blue
+       (copy-face 'bold 'font-lock-function-name-face)
+       (set-face-foreground 'font-lock-function-name-face "blue")
+
+       ;; misc. faces
+       (and (find-face 'font-lock-preprocessor-face) ; 19.13 and above
+            (copy-face 'bold 'font-lock-preprocessor-face))
+       (copy-face 'italic 'font-lock-type-face)
+       (copy-face 'bold 'font-lock-keyword-face)
+       ))
+
+
+;;; ********************
+;;; fast-lock is a package which speeds up the highlighting of files
+;;; by saving information about a font-locked buffer to a file and
+;;; loading that information when the file is loaded again.  This
+;;; requires a little extra disk space be used.
+;;;
+;;; Normally fast-lock puts the cache file (the filename appended with
+;;; .flc) in the same directory as the file it caches.  You can
+;;; specify an alternate directory to use by setting the variable
+;;; fast-lock-cache-directories.
+
+;; Let's use lazy-lock instead.
+;;(add-hook 'font-lock-mode-hook 'turn-on-fast-lock)
+;;(setq fast-lock-cache-directories '("/foo/bar/baz"))
+
+
+;;; ********************
+;;; lazy-lock is a package which speeds up the highlighting of files
+;;; by doing it "on-the-fly" -- only the visible portion of the
+;;; buffer is fontified.  The results may not always be quite as
+;;; accurate as using full font-lock or fast-lock, but it's *much*
+;;; faster.  No more annoying pauses when you load files.
+
+(add-hook 'font-lock-mode-hook 'turn-on-lazy-lock)
+;; I personally don't like "stealth mode" (where lazy-lock starts
+;; fontifying in the background if you're idle for 30 seconds)
+;; because it takes too long to wake up again on my piddly Sparc 1+.
+(setq lazy-lock-stealth-time nil)
+
+
+;;; ********************
+;;; func-menu is a package that scans your source file for function
+;;; definitions and makes a menubar entry that lets you jump to any
+;;; particular function definition by selecting it from the menu.  The
+;;; following code turns this on for all of the recognized languages.
+;;; Scanning the buffer takes some time, but not much.
+;;;
+;;; Send bug reports, enhancements etc to:
+;;; David Hughes <ukchugd@ukpmr.cs.philips.nl>
+;;;
+(cond (running-xemacs
+       (require 'func-menu)
+       (define-key global-map 'f8 'function-menu)
+       (add-hook 'find-file-hooks 'fume-add-menubar-entry)
+       (define-key global-map "\C-cl" 'fume-list-functions)
+       (define-key global-map "\C-cg" 'fume-prompt-function-goto)
+
+       ;; The Hyperbole information manager package uses (shift button2) and
+       ;; (shift button3) to provide context-sensitive mouse keys.  If you
+       ;; use this next binding, it will conflict with Hyperbole's setup.
+       ;; Choose another mouse key if you use Hyperbole.
+       (define-key global-map '(shift button3) 'mouse-function-menu)
+
+       ;; For descriptions of the following user-customizable variables,
+       ;; type C-h v <variable>
+       (setq fume-max-items 25
+             fume-fn-window-position 3
+             fume-auto-position-popup t
+             fume-display-in-modeline-p t
+             fume-menubar-menu-location "File"
+             fume-buffer-name "*Function List*"
+             fume-no-prompt-on-valid-default nil)
+       ))
+
+
+;;; ********************
+;;; MH is a mail-reading system from the Rand Corporation that relies on a
+;;; number of external filter programs (which do not come with emacs.)
+;;; Emacs provides a nice front-end onto MH, called "mh-e".
+;;;
+;; Bindings that let you send or read mail using MH
+;(global-set-key "\C-xm"  'mh-smail)
+;(global-set-key "\C-x4m" 'mh-smail-other-window)
+;(global-set-key "\C-cr"  'mh-rmail)
+
+;; Customization of MH behavior.
+(setq mh-delete-yanked-msg-window t)
+(setq mh-yank-from-start-of-msg 'body)
+(setq mh-summary-height 11)
+
+;; Use lines like the following if your version of MH
+;; is in a special place.
+;(setq mh-progs "/usr/dist/pkgs/mh/bin.svr4/")
+;(setq mh-lib "/usr/dist/pkgs/mh/lib.svr4/")
+
+
+;;; ********************
+;;; resize-minibuffer-mode makes the minibuffer automatically
+;;; resize as necessary when it's too big to hold its contents.
+
+(autoload 'resize-minibuffer-mode "rsz-minibuf" nil t)
+(resize-minibuffer-mode)
+(setq resize-minibuffer-window-exactly nil)
+
+;;; ********************
+;;; W3 is a browser for the World Wide Web, and takes advantage of the very
+;;; latest redisplay features in XEmacs.  You can access it simply by typing 
+;;; 'M-x w3'; however, if you're unlucky enough to be on a machine that is 
+;;; behind a firewall, you will have to do something like this first:
+
+;(setq w3-use-telnet t
+;      ;;
+;      ;; If the Telnet program you use to access the outside world is
+;      ;; not called "telnet", specify its name like this.
+;      w3-telnet-prog "itelnet"
+;      ;;
+;      ;; If your Telnet program adds lines of junk at the beginning
+;      ;; of the session, specify the number of lines here.
+;      w3-telnet-header-length 4
+;      )
diff --git a/lib-src/install-sid b/lib-src/install-sid
new file mode 100755 (executable)
index 0000000..60083f5
--- /dev/null
@@ -0,0 +1,88 @@
+#!/bin/sh
+# Drop in the SUBMITTER id into a site's installed send-pr script.
+# Copyright (C) 1993 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
+# version written by Heinz G. Seidl (hgs@ide.com).
+#
+# This file is part of GNU GNATS.
+#
+# GNU GNATS 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 GNATS 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 GNATS; see the file COPYING.  If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+COMMAND=`echo $0 | sed -e 's,.*/,,g'`
+USAGE="Usage: $COMMAND [--install-dir=prefix] [--help] [--version] submitter-id"
+
+VERSION=3.101
+
+BINDIR=/usr/bin
+
+SUBMITTER=
+TEMP=/tmp/sp$$
+
+if [ $# -eq 0 ]; then
+  echo "$USAGE"
+  exit 1
+fi
+
+while [ $# -gt 0 ]; do
+  case "$1" in
+    -install-dir=*|--install-dir=*|--install-di=*|--install-d=*|--install-=*|--install=*|--instal=*|--insta=*|--inst=*|--ins=*|--in=*|--i=*)
+    I=`echo "$1" | sed 's/-*i[a-z\-]*=//'`
+    BINDIR=$I/bin ;;
+    --version) echo $COMMAND version $VERSION ; exit 1 ;;
+    -*) echo "$USAGE" ; exit 1 ;;
+    *) SUBMITTER=$1 ;;
+  esac
+  shift
+done
+
+path=`echo $0 | sed -e "s;${COMMAND};;"`
+
+[ -z "$path" ] && path=.
+
+examinebindir=yes
+
+if [ "$examinebindir" = yes ] && [ -f $BINDIR/send-pr ]; then
+  SPPATHLIST=$BINDIR/send-pr
+else
+      if [ -f $path/send-pr ]; then
+        SPPATHLIST=$path/send-pr
+      else
+        echo "$COMMAND: cannot find \`$BINDIR/send-pr' or \`$path/send-pr'" >&2
+        exit 1
+      fi
+fi
+
+trap 'rm -f $TEMP ; exit 0' 0
+trap 'echo "$COM: Aborting ..."; rm -f $TEMP ; exit 1' 1 2 3 13 15
+
+for SPPATH in $SPPATHLIST; do
+   sed -e "s/^SUBMITTER=.*/SUBMITTER=${SUBMITTER}/" $SPPATH > $TEMP
+
+   if grep $SUBMITTER $TEMP > /dev/null; then
+      cp $SPPATH $SPPATH.orig &&
+      rm -f $SPPATH &&
+      cp $TEMP $SPPATH &&
+      chmod a+rx $SPPATH &&
+      rm -f $TEMP $SPPATH.orig ||
+      { echo "$COMMAND: unable to replace send-pr" >&2 ; exit 1; }  
+   else
+      echo "$COMMAND: something went wrong when sed-ing the submitter into send-pr" >&2
+      exit 1
+   fi
+done
+
+echo "$COMMAND: \`$SUBMITTER' is now the default submitter ID for send-pr"
+
+exit 0
diff --git a/lib-src/pstogif b/lib-src/pstogif
new file mode 100755 (executable)
index 0000000..9ff1cbf
--- /dev/null
@@ -0,0 +1,189 @@
+: # -*-Perl-*-
+eval 'exec perl -w -S $0 ${1+"$@"}' # Portability kludge
+    if 0;
+# 
+# pstogif.pl v1.0, July 1994, by Nikos Drakos <nikos@cbl.leeds.ac.uk>
+# Computer Based Learning Unit, University of Leeds.
+#
+# Accompanies LaTeX2HTML Version 96.1
+#
+# Script to convert an arbitrary PostScript image to a cropped GIF image
+# suitable for incorporation into HTML documents as inlined images to be
+# viewed with WWW browsers.
+#
+# This is based on the pstoepsi script 
+# by Doug Crabill dgc@cs.purdue.edu
+#
+# Please note the following:
+# - The source PostScript file must end
+#   in a .ps extention.  This is a GhostScript requirement, not mine...
+# - The -density argument has no effect unless the 
+#   color depth (set with the -depth argument) is equal to 1.
+# - Valid arguments for -depth are 1,8, or 24.
+#  
+# This software is provided as is without any guarantee.
+#
+# Nikos Drakos (ND), nikos@cbl.leeds.ac.uk
+# Computer Based Learning Unit, University of Leeds.
+#
+# 15 Jan 96 HS Call ppmquant only if needed.  Fixed bug relative to
+#    V 95.3 .
+#
+# 15 Dec 95 HS (Herbert Swan <dprhws.edp.Arco.com> Added support for
+#    the flip=option.  This allows images to be oriented differently
+#    in the paper versus the electronic media
+#
+# 1 Nov 95 jmn - modified for use with gs ppm driver - from jhrg's patches
+#    note that ppmtops.ps and ppmtops3.ps are no longer needed
+#
+# 20 JUL 94 ND Converted to Perl and made several changes eg it now accepts 
+#    parameters from environment variables or from command line or will use 
+#    default ones. 
+#      
+# 1  APR 94 ND Changed the suffixes of multi-page files from xbm to gif (oops!)
+#
+# 
+
+#####################################################################
+$| =1;
+&read_args;
+
+### You may need to specify some pathnames here if you want to
+### run the script without LaTeX2HTML
+
+# Ghostscript
+$GS= $ENV{'GS'} || 'gs';
+
+# Comes with LaTeX2HTML (For ghostscript versions greater than 3.0 
+# you need the newer pstoppm.ps)
+#$PSTOPPM= $ENV{'PSTOPPM'} ||
+#    'pstoppm.ps';
+
+# Available in the PBMPLUS libary         
+$PNMCROP=$ENV{'PNMCROP'} || 'pnmcrop' ;
+
+# Also in PBMPLUS
+$PNMFLIP=$ENV{'PNMFLIP'} || 'pnmflip' ;
+
+# Also in PBMPPLUS       
+$PPMTOGIF=$ENV{'PPMTOGIF'} || 'ppmtogif' ;
+
+# Also in PBMPPLUS       
+$REDUCE_COLOR=$ENV{'PPMQUANT'} || 'ppmquant 256' ;
+$OUTFILE = $ENV{'OUTFILE'} || $out;
+                       
+# Valid choices for $COLOR_DEPTH are 1, 8 or 24. 
+$DEPTH = $ENV{'DEPTH'} || $depth || 24;
+
+#Default density is 72
+$DENSITY = $ENV{'DENSITY'} || $density || 72;
+    
+# Valid choices are any numbers greater than zero
+# Useful choices are numbers between 0.1 - 5
+# Large numbers may generate very large intermediate files
+# and will take longer to process
+$SCALE = $ENV{'SCALE'} || $scale; # No default value
+
+$PAPERSIZE = $ENV{'PAPERSIZE'} || $papersize; # No default value;
+
+$DEBUG = $ENV{'DEBUG'} || $DEBUG || 0;
+
+######################################################################
+
+&main;
+
+sub read_args {
+    local($_);
+    local($color);
+    while ($ARGV[0] =~ /^-/) {
+       $_ = shift @ARGV;
+       if (/^-h(elp)?$/) {
+           &usage; exit}
+        elsif (/^-out$/) {
+            $out = shift @ARGV;
+       }
+       elsif (/^-(.*)$/) {
+           eval "\$$1 = shift \@ARGV"; # Create and set a flag $<name>
+           }
+    }
+}               
+
+sub main {
+    local($base, $outfile, $i, $j);
+    $base = &test_args;
+    $outfile = $OUTFILE || "$base.gif";
+    open(STDERR, ">/dev/null") unless $DEBUG;
+    &convert($base);
+    if (-f "$base.ppm") {
+       &crop_scale_etc("$base.ppm", $outfile);
+    }
+    else {
+       foreach $i (<$base.[1-9]*ppm>) {
+       $j = $i; 
+       $j =~ s/\.(.*)ppm/$1.gif/;
+       &crop_scale_etc($i, $j)}
+    }                          
+    &cleanup($base);
+}
+
+sub crop_scale_etc {
+    local($in, $out) = @_;
+    local($tmp) = $in . ".tmp";
+    open(STDERR, ">/dev/null") unless $DEBUG;
+
+    if ($flip) {
+       rename($tmp, $in) unless system("$PNMFLIP -$flip $in > $tmp");
+       }
+    system("$PNMCROP $in > $tmp");
+
+    if (system("$PPMTOGIF $tmp > $out")) {
+       print "Running ppmquant for $out\n";
+       system("$REDUCE_COLOR < $tmp|$PPMTOGIF - > $out");
+       }
+    unlink $tmp;
+    print "Writing $out\n";
+}
+
+sub test_args {
+    local($file) = $ARGV[0];
+    if (! ($file =~ s/\.ps$//)) {
+       print "The name of the input file must end in '.ps'\n";
+       exit}
+    elsif (! ( -f "$file.ps")) {
+       print "Cannot find file $file.ps\n.";
+       exit}
+    elsif (! ($DEPTH =~ /^(1|8|24)$/)) {
+       print "The color depth must be 1 or 8 or 24. You specified $DEPTH\n";
+       exit                    
+       }
+    if (defined $SCALE) {
+       if ($SCALE > 0) {
+           $DENSITY = int($SCALE * $DENSITY)}
+       else {
+           print "Error: The scale must be greater than 0.\n" .
+               "You specified $SCALE\n";
+           exit}
+    }
+    $file;
+}
+   
+sub convert {
+    local($base) = @_;
+    local($paperopt) = "-sPAPERSIZE=$PAPERSIZE" if $PAPERSIZE;
+    local($ppmtype) = join('', "ppm",$DEPTH,"run");
+    local($density) = "-r$DENSITY" if ($DENSITY != 72);
+    open (GS, "|$GS -q -dNOPAUSE -dNO_PAUSE -sDEVICE=ppmraw $density -sOutputFile=$base.ppm $paperopt $base.ps");
+    close GS;
+}
+
+sub cleanup {
+    local($base) = @_;
+    unlink <$base[0-9.]*ppm>;
+}
+
+sub usage {
+    print "Usage: pstogif [-h(elp)] [-out <output file>] [-depth <color depth 1, 8 or 24>]  [-flip <Flip_code>] [-density <pixel density>] <file>.ps\n\n";
+}
+
+
diff --git a/lib-src/run.c b/lib-src/run.c
new file mode 100644 (file)
index 0000000..f3830ed
--- /dev/null
@@ -0,0 +1,712 @@
+/* run -- Wrapper program for console mode programs under Windows(TM)
+ * Copyright (C) 1998  Charles S. Wilson
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+/*
+ * This program is based on the runemacs.c distributed with XEmacs 21.0
+ *
+ * Simple program to start gnu-win32 X11 programs (and native XEmacs) 
+ * with its console window hidden.
+ *
+ * This program is provided purely for convenience, since most users will
+ * use XEmacs in windowing (GUI) mode, and will not want to have an extra
+ * console window lying around. Ditto for desktop shortcuts to gnu-win32 
+ * X11 executables.
+ */
+
+
+#define WIN32
+
+#include <windows.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "run.h"
+
+#if defined(__CYGWIN__)
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/cygwin.h>
+ #include <sys/unistd.h>
+WinMainCRTStartup() { mainCRTStartup(); }
+#else
+ #include <direct.h>
+#endif
+
+
+char buffer[1024];
+
+int WINAPI
+WinMain (HINSTANCE hSelf, HINSTANCE hPrev, LPSTR cmdline, int nShow)
+{
+   int wait_for_child = FALSE;
+   int compact_invocation = FALSE;
+   DWORD ret_code = 0;
+
+
+   char execname[FILENAME_MAX];
+   char execpath[MAX_PATH];
+   char* argv[MAX_ARGS+1]; /* leave extra slot for compact_invocation argv[0] */
+   int argc;
+   int i,j;
+   char exec[MAX_PATH + FILENAME_MAX + 100];
+   char cmdline2[MAX_ARGS * MAX_PATH];
+
+   compact_invocation = get_exec_name_and_path(execname,execpath);
+
+   if (compact_invocation)
+   {
+      argv[0] = execname;
+      argc = parse_cmdline_to_arg_array(&(argv[1]),cmdline);
+      argc++;
+   }
+   else
+   {
+      argc = parse_cmdline_to_arg_array(argv,cmdline);
+      if (argc >= 1)
+         strcpy(execname,argv[0]);
+   }
+   /* at this point, execpath is defined, as are argv[] and execname */   
+#ifdef DEBUG
+   j = sprintf(buffer,"\nexecname : %s\nexecpath : %s\n",execname,execpath);
+   for (i = 0; i < argc; i++)
+      j += sprintf(buffer+j,"argv[%d]\t: %s\n",i,argv[i]);
+   Trace((buffer));
+#endif
+
+   if (execname == NULL)
+      error("you must supply a program name to run");
+
+#if defined(__CYGWIN__)
+   /* this insures that we search for symlinks before .exe's */
+   if (compact_invocation)
+      strip_exe(execname);
+#endif
+
+   process_execname(exec,execname,execpath);
+   Trace(("exec\t%s\nexecname\t%s\nexecpath\t%s\n",
+         exec,execname,execpath));
+
+   wait_for_child = build_cmdline(cmdline2,exec,argc,argv);
+   Trace((cmdline2));
+
+   xemacs_special(exec);
+   ret_code = start_child(cmdline2,wait_for_child);
+   if (compact_invocation)
+      for (i = 1; i < argc; i++) // argv[0] was not malloc'ed
+         free(argv[i]);
+   else
+      for (i = 0; i < argc; i++)
+         free(argv[i]);
+   return (int) ret_code;
+}
+int start_child(char* cmdline, int wait_for_child)
+{
+   STARTUPINFO start;
+   SECURITY_ATTRIBUTES sec_attrs;
+   SECURITY_DESCRIPTOR sec_desc;
+   PROCESS_INFORMATION child;
+   int retval;
+
+   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, cmdline, &sec_attrs, NULL, TRUE, 0,
+                      NULL, NULL, &start, &child))
+   {
+      if (wait_for_child)
+      {
+         WaitForSingleObject (child.hProcess, INFINITE);
+         GetExitCodeProcess (child.hProcess, &retval);
+      }
+      CloseHandle (child.hThread);
+      CloseHandle (child.hProcess);
+   }
+   else
+      error("could not start %s",cmdline);
+   return retval;
+}
+void xemacs_special(char* exec)
+{
+  /*
+   * if we're trying to run xemacs, AND this file was in %emacs_dir%\bin,
+   * then set emacs_dir environment variable 
+   */
+   char* p;
+   char* p2;
+   char exec2[MAX_PATH + FILENAME_MAX + 100];
+   char tmp[MAX_PATH + FILENAME_MAX + 100];
+   strcpy(exec2,exec);
+   /* this depends on short-circuit evaluation */
+   if ( ((p = strrchr(exec2,'\\')) && stricmp(p,"\\xemacs") == 0) ||
+        ((p = strrchr(exec2,'/')) && stricmp(p,"/xemacs") == 0) ||
+        ((p = strrchr(exec2,'\\')) && stricmp(p,"\\xemacs.exe") == 0) ||
+        ((p = strrchr(exec2,'/')) && stricmp(p,"/xemacs.exe") == 0) )
+   {
+      if ( ((p2 = strrchr(p, '\\')) && stricmp(p2, "\\bin") == 0) ||
+           ((p2 = strrchr(p, '/')) && stricmp(p2, "/bin") == 0) )
+      {
+         *p2 = '\0';   
+#if defined(__CYGWIN__)
+         CYGWIN_CONV_TO_POSIX_PATH((exec2,tmp));
+         strcpy(exec2,tmp);
+#else /* NATIVE xemacs DOS-style paths with forward slashes */
+         for (p = exec2; *p; p++)
+            if (*p == '\\') *p = '/';
+#endif
+         SetEnvironmentVariable ("emacs_dir", exec2);
+      }
+   }
+}
+int build_cmdline(char* new_cmdline, char* exec, int argc, char* argv[])
+{
+   int retval = FALSE;
+   int first_arg = 1;
+   int i;
+   int char_cnt = 0;
+   /*
+    * look for "-wait" as first true argument; we'll apply that ourselves
+    */
+   if ((argc >= 2) && (stricmp(argv[1],"-wait") == 0))
+   {
+      retval = TRUE;
+      first_arg++;
+   }
+
+   char_cnt = strlen(exec);
+   for (i = first_arg; i < argc; i++)
+      char_cnt += strlen(argv[i]);
+   if (char_cnt > MAX_ARGS*MAX_PATH) /* then we ran out of room */
+      error("command line too long -\n%s",new_cmdline);
+   
+   strcpy(new_cmdline,exec);
+   for (i = first_arg; i < argc; i++)
+   {
+      strcat(new_cmdline," ");
+      strcat(new_cmdline,argv[i]);
+   }
+   return retval;
+}
+/* process exec_arg : if it
+ * NATIVE:
+ *  1) starts with '\\' or '/', it's a root-path and leave it alone
+ *  2) starts with 'x:\\' or 'x:/', it's a root-path and leave it alone
+ *  3) starts with '.\\' or './', two possible meanings:
+ *       1) exec is in the current directory
+ *       2) exec in same directory as this program
+ *  4) otherwise, search path (and _prepend_ "." to the path!!!)
+ *  5) convert all '/' to '\\'
+ * CYGWIN
+ *  1) starts with '\\' or '/', it's a root-path and leave it alone
+ *  2) starts with 'x:\\' or 'x:/', it's a root-path and leave it alone
+ *  3) starts with '.\\' or './', two possible meanings:
+ *       1) exec is in the current directory
+ *       2) exec in same directory as this program
+ *  4) otherwise, search path (and _prepend_ "." to the path!!!)
+ *  5) convert to cygwin-style path to resolve symlinks within the pathspec
+ *  6) check filename: if it's a symlink, resolve it by peeking inside
+ *  7) convert to win32-style path+filename since we're using Windows 
+ *       createProcess() to launch
+ */
+void process_execname(char *exec, const char* execname,const char* execpath )
+{
+   char* orig_pathlist;
+   char* pathlist;
+   char exec_tmp[MAX_PATH + FILENAME_MAX + 100];
+   char exec_tmp2[MAX_PATH + FILENAME_MAX + 100];
+   char buf[MAX_PATH + FILENAME_MAX + 100];
+   int i,j;
+
+   int len = 0;
+   /* 
+    * STARTS WITH / or \ 
+    * execpath NOT used
+    */
+   if ((execname[0] == '\\') || (execname[0] == '/'))
+   {
+#if defined(__CYGWIN__)
+      strcpy(exec_tmp,execname);
+#else    
+      exec_tmp[0] = ((char) (_getdrive() + ((int) 'A') - 1));
+      exec_tmp[1] = ':';
+      exec_tmp[2] = '\0';
+      strcat(exec_tmp,execname);
+#endif
+      Trace(("/ -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
+             exec_tmp,execname,execpath));
+      if (! fileExistsMulti(exec_tmp2,NULL,exec_tmp,exts,NUM_EXTENSIONS) )
+      {
+          j = 0;
+          for (i = 0; i < NUM_EXTENSIONS; i++)
+              j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+          error("Couldn't locate %s\nI tried appending the following "
+                "extensions: \n%s",exec_tmp,buf);
+      }
+      Trace((exec_tmp2));
+   }
+   /* 
+    * STARTS WITH x:\ or x:/
+    * execpath NOT used
+    */
+    else if ((strlen(execname) > 3) && // avoid boundary errors
+       (execname[1] == ':') &&
+       ((execname[2] == '\\') || (execname[2] == '/')))
+   {
+      strcpy(exec_tmp,execname);       
+      Trace(("x: -\nexec_tmp\t%s\nexecname\t%s\nexecpath\t%s\n",
+             exec_tmp,execname,execpath));
+      if (! fileExistsMulti(exec_tmp2,NULL,exec_tmp,exts,NUM_EXTENSIONS) )
+      {
+          j = 0;
+          for (i = 0; i < NUM_EXTENSIONS; i++)
+              j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+          error("Couldn't locate %s\nI tried appending the following "
+                "extensions: \n%s",exec_tmp,buf);
+      }
+      Trace((exec_tmp2));
+   }
+   /* 
+    * STARTS WITH ./ or .\
+    */
+   else if ((execname[0] == '.') &&
+            ((execname[1] == '\\') || (execname[1] == '/')))
+   {
+      if (((char*) getcwd(exec_tmp,MAX_PATH))==NULL)
+         error("can't find current working directory");
+      if (! fileExistsMulti(exec_tmp2,exec_tmp,&(execname[2]),
+                            exts,NUM_EXTENSIONS) )
+          if (! fileExistsMulti(exec_tmp2,execpath,&(execname[2]),
+                                exts,NUM_EXTENSIONS) )
+          {
+              j = 0;
+              for (i = 0; i < NUM_EXTENSIONS; i++)
+                  j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+              error("Couldn't locate %s\n"
+                    "I looked in the following directories:\n [1]: %s\n [2]: %s\n"
+                    "I also tried appending the following "
+                    "extensions: \n%s",execname,exec_tmp,execpath,buf);
+          }
+      Trace((exec_tmp2));
+   }
+   /*
+    * OTHERWISE, SEARCH PATH (prepend '.' and run.exe's directory)
+    * can't use fileExistsMulti because we want to search entire path
+    * for exts[0], then for exts[1], etc.
+    */
+   else
+   {
+      orig_pathlist = getenv("PATH");
+      if ((pathlist = malloc (strlen(orig_pathlist)
+                              + strlen(".") 
+                              + strlen(execpath)+ 3)) == NULL)
+         error("internal error - out of memory");
+      strcpy(pathlist,".");
+      strcat(pathlist,SEP_CHARS);
+      strcat(pathlist,execpath);
+      strcat(pathlist,SEP_CHARS);
+      strcat(pathlist,orig_pathlist);
+
+      Trace((pathlist));
+      for (i = 0; i < NUM_EXTENSIONS; i++)
+      {
+          strcpy(exec_tmp,execname);
+          strcat(exec_tmp,exts[i]);
+          pfopen(exec_tmp2,exec_tmp,pathlist);
+          if (fileExists(NULL,NULL,exec_tmp2))
+              break;
+          exec_tmp2[0] = '\0';
+      }
+      Trace(("exec_tmp\t%s\npathlist\t%s\n",exec_tmp2,pathlist));
+
+      free(pathlist);
+      if (exec_tmp2[0] == '\0')
+      {
+          j = 0;
+          for (i = 0; i < NUM_EXTENSIONS; i++)
+              j += sprintf(buf + j," [%d]: %s\n",i+1,exts[i]);
+          error("Couldn't find %s anywhere.\n"
+                "I even looked in the PATH \n"
+                "I also tried appending the following "
+                "extensions: \n%s",execname,buf);
+      }
+   }
+/*
+ * At this point, we know that exec_tmp2 contains a filename
+ * and we know that exec_tmp2 exists.
+ */
+#if defined(__CYGWIN__)
+   {
+      struct stat stbuf;
+      char sym_link_name[MAX_PATH+1];
+      char real_name[MAX_PATH+1];
+      char dummy[MAX_PATH+1];
+
+      strcpy(exec_tmp,exec_tmp2);
+
+      CYGWIN_CONV_TO_POSIX_PATH((exec_tmp,sym_link_name));
+      Trace((sym_link_name));
+      
+      if (lstat(sym_link_name, &stbuf) == 0)
+      {
+         if ((stbuf.st_mode & S_IFLNK) == S_IFLNK)
+         {
+           if (readlink(sym_link_name, real_name, sizeof(real_name)) == -1)
+               error("problem reading symbolic link for %s",exec_tmp);
+            else
+            {
+                // if realname starts with '/' it's a rootpath 
+                if (real_name[0] == '/')
+                    strcpy(exec_tmp2,real_name);
+                else // otherwise, it's relative to the symlink's location
+                {
+                   CYGWIN_SPLIT_PATH((sym_link_name,exec_tmp2,dummy));
+                   if (!endsWith(exec_tmp2,PATH_SEP_CHAR_STR))
+                      strcat(exec_tmp2,PATH_SEP_CHAR_STR);
+                   strcat(exec_tmp2,real_name);
+                }
+            }
+         }
+         else /* NOT a symlink */
+            strcpy(exec_tmp2, sym_link_name);
+      }
+      else
+         error("can't locate executable - %s",sym_link_name);
+   }
+   CYGWIN_CONV_TO_FULL_WIN32_PATH((exec_tmp2,exec));
+#else                                  
+   strcpy (exec, exec_tmp2);
+#endif  
+}
+int endsWith(const char* s1, const char* s2)
+{
+    int len1;
+    int len2;
+    int retval = FALSE;
+    len1 = strlen(s1);
+    len2 = strlen(s2);
+    if (len1 - len2 >= 0)
+        if (stricmp(&(s1[len1-len2]),s2) == 0)
+            retval = TRUE;
+    return retval;
+}void strip_exe(char* s)
+{
+   if ((strlen(s) > 4) && // long enough to have .exe extension
+       // second part not evaluated (short circuit) if exec_arg too short
+       (stricmp(&(s[strlen(s)-4]),".exe") == 0))
+      s[strlen(s)-4] = '\0';
+}
+void error(char* fmt, ...)
+{
+   char buf[4096];
+   int j;
+   va_list args;
+   va_start(args, fmt);
+   j =   sprintf(buf,    "Error: ");
+   j += vsprintf(buf + j,fmt,args);
+   j +=  sprintf(buf + j,"\n");
+   va_end(args);
+   MessageBox(NULL, buf, "Run.exe", MB_ICONSTOP);
+   exit(1);
+}
+void message(char* fmt, ...)
+{
+   char buf[10000];
+   int j;
+   va_list args;
+   va_start(args, fmt);
+   j = vsprintf(buf,fmt,args);
+   j +=  sprintf(buf + j,"\n");
+   va_end(args);
+   MessageBox(NULL, buf, "Run.exe Message", MB_ICONSTOP);
+}
+void Trace_(char* fmt, ...)
+{
+   char buf[10000];
+   int j;
+   va_list args;
+   va_start(args, fmt);
+   j = vsprintf(buf,fmt,args);
+   j +=  sprintf(buf + j,"\n");
+   va_end(args);
+   MessageBox(NULL, buf, "Run.exe DEBUG", MB_ICONSTOP);
+}
+/*
+ * Uses system info to determine the path used to invoke run
+ * Also attempts to deduce the target execname if "compact_invocation"
+ * method was used.
+ *
+ * returns TRUE if compact_invocation method was used
+ *   (and target execname was deduced successfully)
+ * otherwise returns FALSE, and execname == run or run.exe
+ */
+int get_exec_name_and_path(char* execname, char* execpath)
+{
+   char modname[MAX_PATH];
+   char* tmp_execname;
+   char* p;
+   int retval = FALSE;
+
+   if (!GetModuleFileName (NULL, modname, MAX_PATH))
+      error("internal error - can't find my own name");
+   if ((p = strrchr (modname, '\\')) == NULL)
+      error("internal error - my own name has no path\n%s",modname);
+   tmp_execname = p + 1;
+   p[0] = '\0';
+   // if invoked by a name like "runxemacs" then strip off
+   // the "run" and let "xemacs" be execname.
+   // To check for this, make that:
+   //   1) first three chars are "run"
+   //   2) but the string doesn't end there, or start ".exe"
+   // Also, set "compact_invocation" TRUE
+   if ( ((tmp_execname[0] == 'r') || (tmp_execname[0] == 'R')) &&
+        ((tmp_execname[1] == 'u') || (tmp_execname[1] == 'U')) &&
+        ((tmp_execname[2] == 'n') || (tmp_execname[2] == 'N')) &&
+        ((tmp_execname[3] != '.') && (tmp_execname[3] != '\0')) )
+   {
+      tmp_execname += 3;
+      retval = TRUE;
+   }
+   else
+      tmp_execname = NULL;
+
+   if (tmp_execname == NULL)
+      strcpy(execname,"");
+   else
+      strcpy(execname,tmp_execname);
+#if defined(__CYGWIN__)
+   CYGWIN_CONV_TO_POSIX_PATH((modname,execpath));
+#else
+   strcpy(execpath,modname);
+#endif
+   return retval;
+}
+/*
+ * works like strtok, but:
+ * double quotes (") suspends tokenizing until closing " reached
+ * CYGWIN ONLY:
+ *   additionally, backslash escapes next character, even if that
+ *   next character is a delimiter. Or a double quote.
+ *   WARNING: this means that backslash may NOT be a delimiter 
+ */
+char* my_strtok(char* s, const char* delim, char** lasts)
+{
+   char *spanp;
+   int c, sc;
+   char *tok;
+   
+   if ((s == NULL) && ((s = *lasts) == NULL))
+      return NULL;
+   /* Skip leading delimiters */
+cont:
+   c = *s++;
+   for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
+      if (c == sc)
+         goto cont;
+   }
+   if (c == 0) {               /* no non-delimiter characters */
+      *lasts = NULL;
+      return (NULL);
+   }
+   tok = s - 1;
+   /*
+    * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
+    * Note that delim must have one NUL; we stop if we see that, too.
+    * If we see a double quote, continue until next double quote, then
+    *   start scanning for delimiters again.
+    * CYGWIN ONLY: if we see a backslash, just copy next character -
+    *   don't consider it as a delimiter even if it is in delim string.
+    */
+   for (;;) {
+      /* if this c is ", then scan until we find next " */
+      if (c == '\"')
+         while ((c = *s++) != '\"')
+            if (c == 0) /* oops, forgot to close the ", clean up & return */
+            {
+               s = NULL;
+               *lasts = s;
+               return (tok);
+            }
+#if defined(__CYGWIN__)
+      if (c == '\\')
+      {
+         c = *s++; /* skip the backslash */
+         if (c == 0) /* if escaped character is end-of-string, clean up & return */
+         {
+            s = NULL;
+            *lasts = s;
+            return (tok);
+         }
+         c = *s++; /* otherwise, skip the escaped character */
+      }
+#endif   
+      spanp = (char *)delim;
+      do {
+         if ((sc = *spanp++) == c) {
+            if (c == 0)
+               s = NULL;
+            else
+               s[-1] = 0;
+            *lasts = s;
+            return (tok);
+         }
+      } while (sc != 0);
+      c = *s++;
+   }
+   /* NOTREACHED */
+}
+int parse_cmdline_to_arg_array(char* argv[MAX_ARGS], char* cmdline)
+{
+   char seps[] = " \t\n";
+   char* token;
+   int argc = 0;
+   char* lasts;
+
+   token = my_strtok(cmdline, seps, &lasts);
+   while ((token != NULL) && (argc < MAX_ARGS))
+   {
+      if ((argv[argc] = malloc(strlen(token)+1)) == NULL)
+      {
+         error("internal error - out of memory");
+      }
+      strcpy(argv[argc++],token);
+      token = my_strtok(NULL,seps,&lasts);
+   }
+   if (argc >= MAX_ARGS)
+      error("too many arguments on commandline\n%s",cmdline);
+   return argc;
+}
+/* Taken from pfopen.c by David Engel (5-Jul-97).
+ * Original comments appear below. Superseded by next comment block.
+ *
+ *  Written and released to the public domain by David Engel.
+ *
+ *  This function attempts to open a file which may be in any of
+ *  several directories.  It is particularly useful for opening
+ *  configuration files.  For example, PROG.EXE can easily open
+ *  PROG.CFG (which is kept in the same directory) by executing:
+ *
+ *      cfg_file = pfopen("PROG.CFG", "r", getenv("PATH"));
+ *
+ *  NULL is returned if the file can't be opened.
+ */
+
+/*
+ * This function attempts to locate a file which may be in any of
+ * several directories. Unlike the original pfopen, it does not
+ * return a FILE pointer to the opened file, but rather returns
+ * the fully-qualified filename of the first match found. Returns
+ * empty string if not found.
+ */
+char *pfopen(char *retval, const char *name, const char *dirs)
+{
+    char *ptr;
+    char *tdirs;
+    char returnval[MAX_PATH + FILENAME_MAX + 100];
+    char *recursive_name;
+    int foundit = FALSE;
+    
+    returnval[0] = '\0';
+
+    if (dirs == NULL || dirs[0] == '\0')
+        return NULL;
+
+    if ((tdirs = malloc(strlen(dirs)+1)) == NULL)
+        return NULL;
+
+    strcpy(tdirs, dirs);
+
+    for (ptr = strtok(tdirs, SEP_CHARS); (foundit == FALSE) && ptr != NULL;
+         ptr = strtok(NULL, SEP_CHARS))
+    {
+       foundit = fileExists(returnval,ptr,name);
+    }
+
+    free(tdirs);
+    if (!foundit)
+        retval[0] = '\0';
+    else
+        strcpy(retval,returnval);
+    return retval;
+}
+int fileExistsMulti(char* fullname, const char* path, 
+                    const char* name_noext, const char* exts[],
+                    const int extcnt)
+{
+    char tryName[MAX_PATH + FILENAME_MAX];
+    int i = 0;
+    int retval = FALSE;
+    fullname[0] = '\0';
+    for (i = 0; i < extcnt; i++)
+    {
+        strcpy(tryName,name_noext);
+        strcat(tryName,exts[i]);
+        if (fileExists(fullname, path, tryName) == TRUE)
+        {
+            retval = TRUE;
+            break;
+        }
+        fullname[0] = '\0';
+    }
+    return retval;
+}
+int fileExists(char* fullname, const char* path, const char* name)
+{
+   int retval = FALSE;
+   FILE* file;
+   size_t len;
+   char work[FILENAME_MAX];
+   char work2[MAX_PATH + FILENAME_MAX + 100];
+   if (path != NULL)
+   {
+      strcpy(work, path);
+      len = strlen(work);
+      if (len && work[len-1] != '/' && work[len-1] != '\\')
+         strcat(work, PATH_SEP_CHAR_STR);
+   }
+   else
+      work[0]='\0';
+   
+   strcat(work, name);
+#if defined(__CYGWIN__)
+   CYGWIN_CONV_TO_POSIX_PATH((work, work2)); 
+#else
+   strcpy(work2,work);
+#endif
+
+#ifdef DEBUGALL
+   Trace(("looking for...\t%s\n",work2));
+#endif
+
+   file = fopen(work2, "rb");
+   if (file != NULL)
+   {
+      if (fullname != NULL)
+         strcpy(fullname,work2);
+      retval = TRUE;
+      fclose(file);
+   }
+   return retval;
+}
diff --git a/lib-src/send-pr b/lib-src/send-pr
new file mode 100755 (executable)
index 0000000..3c97e40
--- /dev/null
@@ -0,0 +1,530 @@
+#!/bin/sh
+# Submit a problem report to a GNATS site.
+# Copyright (C) 1993 Free Software Foundation, Inc.
+# Contributed by Brendan Kehoe (brendan@cygnus.com), based on a
+# version written by Heinz G. Seidl (hgs@cygnus.com).
+#
+# This file is part of GNU GNATS.
+#
+# GNU GNATS 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 GNATS 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 GNATS; see the file COPYING.  If not, write to
+# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# The version of this send-pr.
+VERSION=3.101
+
+# The submitter-id for your site.
+SUBMITTER=net
+
+# Where the GNATS directory lives, if at all.
+[ -z "$GNATS_ROOT" ] && 
+GNATS_ROOT=/usr/lib/gnats/gnats-db
+
+# The default mail address for PR submissions. 
+GNATS_ADDR=bugs@xemacs.org
+
+# Where the gnats category tree lives.
+[ -z "$DATADIR" ] &&
+DATADIR=/usr/share
+
+# If we've been moved around, try using GCC_EXEC_PREFIX.
+[ ! -d $DATADIR/gnats -a -d "$GCC_EXEC_PREFIX" ] && 
+  DATADIR=${GCC_EXEC_PREFIX}../../../lib
+
+
+# The default release for this host.
+DEFAULT_RELEASE="gnats-3.101"
+
+# The default organization.
+DEFAULT_ORGANIZATION="XEmacs Users"
+
+# The default site to look for.
+GNATS_SITE=xemacs.org
+
+# Newer config information?
+[ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
+
+# What mailer to use.  This must come after the config file, since it is
+# host-dependent.
+MAIL_AGENT="/usr/lib/sendmail -oi -t"
+
+# How to read the passwd database.
+PASSWD="cat /etc/passwd"
+
+ECHON=bsd
+
+if [ $ECHON = bsd ] ; then
+  ECHON1="echo -n"
+  ECHON2=
+elif [ $ECHON = sysv ] ; then
+  ECHON1=echo
+  ECHON2='\c'
+else
+  ECHON1=echo
+  ECHON2=
+fi
+
+#\f
+
+if [ -z "$TMPDIR" ]; then
+  TMPDIR=/tmp
+else
+  if [ "`echo $TMPDIR | grep '/$'`" != "" ]; then
+    TMPDIR="`echo $TMPDIR | sed -e 's,/$,,'`"
+  fi
+fi
+
+TEMP=$TMPDIR/p$$
+BAD=$TMPDIR/pbad$$
+REF=$TMPDIR/pf$$
+
+# find a user name
+if [ "$LOGNAME" = "" ]; then
+       if [ "$USER" != "" ]; then
+               LOGNAME="$USER"
+       else
+               LOGNAME="UNKNOWN"
+       fi
+fi
+
+FROM="$LOGNAME"
+if [ -z "$REPLYTO" ]; then
+  REPLYTO="$LOGNAME"
+fi
+
+# Find out the name of the originator of this PR.
+if [ -n "$NAME" ]; then
+  ORIGINATOR="$NAME"
+elif [ -f $HOME/.fullname ]; then
+  ORIGINATOR="`sed -e '1q' $HOME/.fullname`"
+else
+  # Must use temp file due to incompatibilities in quoting behavior
+  # and to protect shell metacharacters in the expansion of $LOGNAME
+  $PASSWD | grep "^$LOGNAME:" | awk -F: '{print $5}' | sed -e 's/,.*//' > $TEMP
+  ORIGINATOR="`cat $TEMP`"
+  rm -f $TEMP
+fi
+
+if [ -n "$ORGANIZATION" ]; then
+  if [ -f "$ORGANIZATION" ]; then
+    ORGANIZATION="`cat $ORGANIZATION`"
+  fi
+else
+  if [ -n "$DEFAULT_ORGANIZATION" ]; then
+    ORGANIZATION="$DEFAULT_ORGANIZATION"
+  elif [ -f $HOME/.organization ]; then
+    ORGANIZATION="`cat $HOME/.organization`"
+  elif [ -f $HOME/.signature ]; then
+    ORGANIZATION="`cat $HOME/.signature`"
+  fi
+fi
+
+# If they don't have a preferred editor set, then use
+if [ -z "$VISUAL" ]; then
+  if [ -z "$EDITOR" ]; then
+    EDIT=vi
+  else
+    EDIT="$EDITOR"
+  fi
+else
+  EDIT="$VISUAL"
+fi
+
+# Find out some information.
+SYSTEM=`( [ -f /bin/uname ] && /bin/uname -a ) || \
+        ( [ -f /usr/bin/uname ] && /usr/bin/uname -a ) || echo ""`
+ARCH=`[ -f /bin/arch ] && /bin/arch`
+MACHINE=`[ -f /bin/machine ] && /bin/machine`
+
+COMMAND=`echo $0 | sed -e 's,.*/,,'`
+USAGE="Usage: $COMMAND [-PVL] [-t address] [-f filename] [-s severity]
+       [-c address] [--request-id] [--version]"
+REMOVE=
+BATCH=
+CC=
+SEVERITY_C=
+
+while [ $# -gt 0 ]; do
+  case "$1" in
+    -r) ;;             # Ignore for backward compat.
+    -t | --to) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+       shift ; GNATS_ADDR="$1"
+       EXPLICIT_GNATS_ADDR=true
+        ;;
+    -f | --file) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+       shift ; IN_FILE="$1"
+       if [ "$IN_FILE" != "-" -a ! -r "$IN_FILE" ]; then
+         echo "$COMMAND: cannot read $IN_FILE"
+         exit 1
+       fi
+       ;;
+    -b | --batch) BATCH=true ;;
+    -c | --cc) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+       shift ; CC="$1"
+       ;;
+    -s | --severity) if [ $# -eq 1 ]; then echo "$USAGE"; exit 1; fi
+       shift ; SEVERITY_C="$1"
+       ;;
+    -p | -P | --print) PRINT=true ;;
+    -L | --list) FORMAT=norm ;;
+    -l | -CL | --lisp) FORMAT=lisp ;;
+    --request-id) REQUEST_ID=true ;;
+    -h | --help) echo "$USAGE"; exit 0 ;;
+    -V | --version) echo "$VERSION"; exit 0 ;;
+    -*) echo "$USAGE" ; exit 1 ;;
+    *) if [ -z "$USER_GNATS_SITE" ]; then
+        if [ ! -r "$DATADIR/gnats/$1" ]; then
+          echo "$COMMAND: the GNATS site $1 does not have a categories list."
+          exit 1
+        else
+          # The site name is the alias they'll have to have created.
+          USER_GNATS_SITE=$1
+        fi
+       else
+        echo "$USAGE" ; exit 1
+       fi
+       ;;
+ esac
+ shift
+done
+
+if [ -n "$USER_GNATS_SITE" ] && [ "$USER_GNATS_SITE" != "$GNATS_SITE" ]; then
+  GNATS_SITE=$USER_GNATS_SITE
+  GNATS_ADDR=$USER_GNATS_SITE-gnats
+fi
+
+if [ "$SUBMITTER" = "unknown" -a -z "$REQUEST_ID" -a -z "$IN_FILE" ]; then
+  cat << '__EOF__'
+It seems that send-pr is not installed with your unique submitter-id.
+You need to run
+
+          install-sid YOUR-SID
+
+where YOUR-SID is the identification code you received with `send-pr'.
+`send-pr' will automatically insert this value into the template field
+`>Submitter-Id'.  If you've downloaded `send-pr' from the Net, use `net'
+for this value.  If you do not know your id, run `send-pr --request-id' to 
+get one from your support site.
+__EOF__
+  exit 1
+fi
+
+if [ -r "$DATADIR/gnats/$GNATS_SITE" ]; then
+  CATEGORIES=`grep -v '^#' $DATADIR/gnats/$GNATS_SITE | sort`
+else
+  echo "$COMMAND: could not read $DATADIR/gnats/$GNATS_SITE for categories list."
+  exit 1
+fi
+
+if [ -z "$CATEGORIES" ]; then
+  echo "$COMMAND: the categories list for $GNATS_SITE was empty!"
+  exit 1
+fi
+
+case "$FORMAT" in
+  lisp) echo "$CATEGORIES" | \
+        awk 'BEGIN {printf "( "} {printf "(\"%s\") ",$0} END {printf ")\n"}'
+        exit 0
+        ;;
+  norm) l=`echo "$CATEGORIES" | \
+       awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+            END {print max + 1;}'`
+       c=`expr 70 / $l`
+       if [ $c -eq 0 ]; then c=1; fi
+       echo "$CATEGORIES" | \
+        awk 'BEGIN {print "Known categories:"; i = 0 }
+          { printf ("%-'$l'.'$l's", $0); if ((++i % '$c') == 0) { print "" } }
+            END { print ""; }'
+        exit 0
+        ;;
+esac
+
+ORIGINATOR_C='<name of the PR author (one line)>'
+ORGANIZATION_C='<organization of PR author (multiple lines)>'
+CONFIDENTIAL_C='<[ yes | no ] (one line)>'
+SYNOPSIS_C='<synopsis of the problem (one line)>'
+if [ -z "$SEVERITY_C" ]; then
+  SEVERITY_C='<[ non-critical | serious | critical ] (one line)>'
+fi
+PRIORITY_C='<[ low | medium | high ] (one line)>'
+CATEGORY_C='<name of the product (one line)>'
+CLASS_C='<[ sw-bug | doc-bug | change-request | support ] (one line)>'
+RELEASE_C='<release number or tag (one line)>'
+ENVIRONMENT_C='<machine, os, target, libraries (multiple lines)>'
+DESCRIPTION_C='<precise description of the problem (multiple lines)>'
+HOW_TO_REPEAT_C='<code/input/activities to reproduce the problem (multiple lines)>'
+FIX_C='<how to correct or work around the problem, if known (multiple lines)>'
+
+# Catch some signals. ($xs kludge needed by Sun /bin/sh)
+xs=0
+trap 'rm -f $REF $TEMP; exit $xs' 0
+trap 'echo "$COMMAND: Aborting ..."; rm -f $REF $TEMP; xs=1; exit' 1 2 3 13 15
+
+# If they told us to use a specific file, then do so.
+if [ -n "$IN_FILE" ]; then
+  if [ "$IN_FILE" = "-" ]; then
+    # The PR is coming from the standard input.
+    if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+      sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" > $TEMP
+    else
+      cat > $TEMP
+    fi
+  else
+    # Use the file they named.
+    if [ -n "$EXPLICIT_GNATS_ADDR" ]; then
+      sed -e "s;^[Tt][Oo]:.*;To: $GNATS_ADDR;" $IN_FILE > $TEMP
+    else
+      cat $IN_FILE > $TEMP
+    fi
+  fi
+else
+
+  if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+    # If their PR_FORM points to a bogus entry, then bail.
+    if [ ! -f "$PR_FORM" -o ! -r "$PR_FORM" -o ! -s "$PR_FORM" ]; then
+      echo "$COMMAND: can't seem to read your template file (\`$PR_FORM'), ignoring PR_FORM"
+      sleep 1
+      PRINT_INTERN=bad_prform
+    fi
+  fi
+
+  if [ -n "$PR_FORM" -a -z "$PRINT_INTERN" ]; then
+    cp $PR_FORM $TEMP || 
+      ( echo "$COMMAND: could not copy $PR_FORM" ; xs=1; exit )
+  else
+    for file in $TEMP $REF ; do
+      cat  > $file << '__EOF__'
+SEND-PR: -*- send-pr -*-
+SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
+SEND-PR: will all comments (text enclosed in `<' and `>').
+SEND-PR: 
+SEND-PR: Please consult the send-pr man page `send-pr(1)' or the Texinfo
+SEND-PR: manual if you are not sure how to fill out a problem report.
+SEND-PR:
+SEND-PR: Choose from the following categories:
+SEND-PR:
+__EOF__
+
+      # Format the categories so they fit onto lines.
+       l=`echo "$CATEGORIES" | \
+       awk 'BEGIN {max = 0; } { if (length($0) > max) { max = length($0); } }
+            END {print max + 1;}'`
+       c=`expr 61 / $l`
+       if [ $c -eq 0 ]; then c=1; fi
+       echo "$CATEGORIES" | \
+        awk 'BEGIN {printf "SEND-PR: "; i = 0 }
+          { printf ("%-'$l'.'$l's", $0);
+           if ((++i % '$c') == 0) { printf "\nSEND-PR: " } }
+            END { printf "\nSEND-PR:\n"; }' >> $file
+
+      cat >> $file << __EOF__
+To: $GNATS_ADDR
+Subject: 
+From: $FROM
+Reply-To: $REPLYTO
+Cc: $CC
+X-send-pr-version: $VERSION
+
+
+>Submitter-Id: $SUBMITTER
+>Originator:   $ORIGINATOR
+>Organization:
+${ORGANIZATION-        $ORGANIZATION_C}
+>Confidential: $CONFIDENTIAL_C
+>Synopsis:     $SYNOPSIS_C
+>Severity:     $SEVERITY_C
+>Priority:     $PRIORITY_C
+>Category:     $CATEGORY_C
+>Class:                $CLASS_C
+>Release:      ${DEFAULT_RELEASE-$RELEASE_C}
+>Environment:
+       $ENVIRONMENT_C
+`[ -n "$SYSTEM" ] && echo System: $SYSTEM`
+`[ -n "$ARCH" ] && echo Architecture: $ARCH`
+`[ -n "$MACHINE" ] && echo Machine: $MACHINE`
+>Description:
+       $DESCRIPTION_C
+>How-To-Repeat:
+       $HOW_TO_REPEAT_C
+>Fix:
+       $FIX_C
+__EOF__
+    done
+  fi
+
+  if [ "$PRINT" = true -o "$PRINT_INTERN" = true ]; then
+    cat $TEMP
+    xs=0; exit
+  fi
+
+  chmod u+w $TEMP
+  if [ -z "$REQUEST_ID" ]; then
+    eval $EDIT $TEMP
+  else
+    ed -s $TEMP << '__EOF__'
+/^Subject/s/^Subject:.*/Subject: request for a customer id/
+/^>Category/s/^>Category:.*/>Category: send-pr/
+w
+q
+__EOF__
+  fi
+
+  if cmp -s $REF $TEMP ; then
+    echo "$COMMAND: problem report not filled out, therefore not sent"
+    xs=1; exit
+  fi
+fi
+
+#\f
+#      Check the enumeration fields
+
+# This is a "sed-subroutine" with one keyword parameter 
+# (with workaround for Sun sed bug)
+#
+SED_CMD='
+/$PATTERN/{
+s|||
+s|<.*>||
+s|^[   ]*||
+s|[    ]*$||
+p
+q
+}'
+
+
+while [ -z "$REQUEST_ID" ]; do
+  CNT=0
+
+  # 1) Confidential
+  #
+  PATTERN=">Confidential:"
+  CONFIDENTIAL=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+  case "$CONFIDENTIAL" in
+    ""|yes|no) CNT=`expr $CNT + 1` ;;
+    *) echo "$COMMAND: \`$CONFIDENTIAL' is not a valid value for \`Confidential'." ;;
+  esac
+  #
+  # 2) Severity
+  #
+  PATTERN=">Severity:"
+  SEVERITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+  case "$SEVERITY" in
+    ""|non-critical|serious|critical) CNT=`expr $CNT + 1` ;;
+    *)  echo "$COMMAND: \`$SEVERITY' is not a valid value for \`Severity'."
+  esac
+  #
+  # 3) Priority
+  #
+  PATTERN=">Priority:"
+  PRIORITY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+  case "$PRIORITY" in
+    ""|low|medium|high) CNT=`expr $CNT + 1` ;;
+    *)  echo "$COMMAND: \`$PRIORITY' is not a valid value for \`Priority'."
+  esac
+  #
+  # 4) Category
+  #
+  PATTERN=">Category:"
+  CATEGORY=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+  FOUND=
+  for C in $CATEGORIES
+  do
+    if [ "$C" = "$CATEGORY" ]; then FOUND=true ; break ; fi
+  done
+  if [ -n "$FOUND" ]; then
+    CNT=`expr $CNT + 1`        
+  else
+    if [ -z "$CATEGORY" ]; then
+      echo "$COMMAND: you must include a Category: field in your report."
+    else
+      echo "$COMMAND: \`$CATEGORY' is not a known category."
+    fi
+  fi
+  #
+  # 5) Class
+  #
+  PATTERN=">Class:"
+  CLASS=`eval sed -n -e "\"$SED_CMD\"" $TEMP`
+  case "$CLASS" in
+    ""|sw-bug|doc-bug|change-request|support) CNT=`expr $CNT + 1` ;;
+    *)  echo "$COMMAND: \`$CLASS' is not a valid value for \`Class'."
+  esac
+
+  [ $CNT -lt 5 -a -z "$BATCH" ] && 
+    echo "Errors were found with the problem report."
+
+  while true; do
+    if [ -z "$BATCH" ]; then
+      $ECHON1 "a)bort, e)dit or s)end? $ECHON2"
+      read input
+    else
+      if [ $CNT -eq 5 ]; then
+        input=s
+      else
+        input=a
+      fi
+    fi
+    case "$input" in
+      a*)
+       if [ -z "$BATCH" ]; then
+         echo "$COMMAND: the problem report remains in $BAD and is not sent."
+         mv $TEMP $BAD
+        else
+         echo "$COMMAND: the problem report is not sent."
+       fi
+       xs=1; exit
+       ;;
+      e*)
+        eval $EDIT $TEMP
+       continue 2
+       ;;
+      s*)
+       break 2
+       ;;
+    esac
+  done
+done
+#
+#      Remove comments and send the problem report
+#      (we have to use patterns, where the comment contains regex chars)
+#
+# /^>Originator:/s;$ORIGINATOR;;
+sed  -e "
+/^SEND-PR:/d
+/^>Organization:/,/^>[A-Za-z-]*:/s;$ORGANIZATION_C;;
+/^>Confidential:/s;<.*>;;
+/^>Synopsis:/s;$SYNOPSIS_C;;
+/^>Severity:/s;<.*>;;
+/^>Priority:/s;<.*>;;
+/^>Category:/s;$CATEGORY_C;;
+/^>Class:/s;<.*>;;
+/^>Release:/,/^>[A-Za-z-]*:/s;$RELEASE_C;;
+/^>Environment:/,/^>[A-Za-z-]*:/s;$ENVIRONMENT_C;;
+/^>Description:/,/^>[A-Za-z-]*:/s;$DESCRIPTION_C;;
+/^>How-To-Repeat:/,/^>[A-Za-z-]*:/s;$HOW_TO_REPEAT_C;;
+/^>Fix:/,/^>[A-Za-z-]*:/s;$FIX_C;;
+" $TEMP > $REF
+
+if $MAIL_AGENT < $REF; then
+  echo "$COMMAND: problem report sent"
+  xs=0; exit
+else
+  echo "$COMMAND: mysterious mail failure."
+  if [ -z "$BATCH" ]; then
+    echo "$COMMAND: the problem report remains in $BAD and is not sent."
+    mv $REF $BAD
+  else
+    echo "$COMMAND: the problem report is not sent."
+  fi
+  xs=1; exit
+fi
diff --git a/lib-src/tm-au b/lib-src/tm-au
new file mode 100755 (executable)
index 0000000..4309ebe
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/sh -
+#
+# $Id: tm-au,v 1.6 1997/02/15 22:20:26 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+
+if [ "$5" = "" ]; then
+       filename="$TM_TMP_DIR/mime$$.au"
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+
+case "$4" in
+"play")
+       echo "$2; $3 ->"
+       tmdecode $3 $1 $filename
+       if [ "$AUDIOSERVER" = "" ]; then
+          case "`uname`" in
+            IRIX )  sfplay $filename           ;;
+            OSF1 )  decsound -play $filename   ;;
+            *    )  cat $filename > /dev/audio ;;
+          esac
+       else
+          autool -v 40 $filename
+       fi
+        
+       trap 'rm -f $filename' 0 1 2 3 13 15
+       ;;
+"extract")
+       echo "$2; $3 -> $filename"
+       echo "extract to $filename"
+       tmdecode $3 $1 $filename
+       ;;
+esac
diff --git a/lib-src/tm-file b/lib-src/tm-file
new file mode 100755 (executable)
index 0000000..359b357
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh -
+#
+# $Id: tm-file,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+
+if [ "$5" = "" ]; then
+       filename="$TM_TMP_DIR/mime$$"
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
diff --git a/lib-src/tm-html b/lib-src/tm-html
new file mode 100755 (executable)
index 0000000..aa4d27d
--- /dev/null
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# $Id: tm-html,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+    TM_TMP_DIR=/tmp
+    export TM_TMP_DIR
+fi
+
+if [ "$TM_WWW_BROWSER" = "" ]; then
+    TM_WWW_BROWSER=netscape
+    export TM_WWW_BROWSER
+fi
+
+if [ "$5" = "" ]; then
+    filename="$TM_TMP_DIR/mime$$.html"
+else
+    filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode "$3" $1 $filename
+
+case "$4" in
+"play")
+    if [ `echo $TM_WWW_BROWSER | grep netscape` ]; then
+       echo netscape
+       if [ -h $HOME/.netscape/lock ]; then
+           netscape -remote "openURL(file:$filename,new-window)"
+        else
+           netscape $filename
+        fi
+    else
+       echo not netscape
+       $TM_WWW_BROWSER $filename
+    fi
+    trap 'rm -f $filename' 0 1 2 3 13 15
+    ;;
+"extract")
+    echo "extract to $filename"
+    ;;
+esac
diff --git a/lib-src/tm-image b/lib-src/tm-image
new file mode 100755 (executable)
index 0000000..78646e1
--- /dev/null
@@ -0,0 +1,71 @@
+#!/bin/sh -
+#
+# $Id: tm-image,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+       case "$2" in
+       "image/gif")
+               filename="$TM_TMP_DIR/mime$$.gif"
+               ;;
+       "image/jpeg")
+               filename="$TM_TMP_DIR/mime$$.jpg"
+               ;;
+       "image/tiff"|"image/x-tiff")
+               filename="$TM_TMP_DIR/mime$$.tif"
+               ;;
+       "image/x-xwd")
+               filename="$TM_TMP_DIR/mime$$.xwd"
+               ;;
+       "image/x-xbm")
+               filename="$TM_TMP_DIR/mime$$.xbm"
+               ;;
+       "image/x-pic")
+               filename="$TM_TMP_DIR/mime$$.pic"
+               ;;
+       "image/x-mag")
+               filename="$TM_TMP_DIR/mime$$.mag"
+               ;;
+       *)
+               filename="$TM_TMP_DIR/mime$$.img"
+               ;;
+       esac
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
+
+case "$4" in
+"play")
+       xv -geometry +1+1 $filename
+       trap 'rm -f $filename' 0 1 2 3 13 15
+       ;;
+"extract")
+       echo "extract to $filename"
+       ;;
+esac
diff --git a/lib-src/tm-mpeg b/lib-src/tm-mpeg
new file mode 100755 (executable)
index 0000000..88c5c1c
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh -
+#
+# $Id: tm-mpeg,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+       filename="$TM_TMP_DIR/mime$$.mpg"
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+echo "$2; $3 -> $filename"
+
+tmdecode $3 $1 $filename
+
+case "$4" in
+"play")
+       if [ "$VIDEO_DITHER" = "" ]; then
+               VIDEO_DITHER=gray
+               export VIDEO_DITHER
+       fi
+       mpeg_play -dither $VIDEO_DITHER $filename
+       trap 'rm -f $filename' 0 1 2 3 13 15
+       ;;
+"extract")
+       echo "extract to $filename"
+       ;;
+esac
diff --git a/lib-src/tm-plain b/lib-src/tm-plain
new file mode 100755 (executable)
index 0000000..7035779
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/sh -
+#
+# $Id: tm-plain,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994,1995,1996,1997 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+       filename="$TM_TMP_DIR/mime$$.pln"
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+case "$4" in
+"play")
+       echo "$2; $3 ->"
+       tmdecode "$3" "$1" /dev/stdout
+       ;;
+"extract")
+       echo "$2; $3 -> $filename"
+       echo "extract to $filename"
+       tmdecode "$3" "$1" $filename
+       ;;
+"print")
+       echo "$2; $3 ->"
+       tmdecode "$3" "$1" /dev/stdout | lpr
+       ;;
+esac
diff --git a/lib-src/tm-ps b/lib-src/tm-ps
new file mode 100755 (executable)
index 0000000..d816945
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh -
+#
+# $Id: tm-ps,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+if [ "$TM_TMP_DIR" = "" ]; then
+       TM_TMP_DIR=/tmp
+       export TM_TMP_DIR
+fi
+if [ "$5" = "" ]; then
+       filename="$TM_TMP_DIR/mime$$.pln"
+else
+       filename="$TM_TMP_DIR/$5"
+fi
+
+case "$4" in
+"play")
+       echo "$2; $3 -> $filename"
+       tmdecode $3 $1 $filename
+       ghostview $filename
+       trap 'rm -f $filename' 0 1 2 3 13 15
+       ;;
+"extract")
+       echo "$2; $3 -> $filename"
+       echo "extract to $filename"
+       tmdecode "$3" "$1" $filename
+       ;;
+"print")
+       echo "$2; $3 ->"
+       tmdecode "$3" "$1" /dev/stdout | lpr
+       ;;
+esac
diff --git a/lib-src/tmdecode b/lib-src/tmdecode
new file mode 100755 (executable)
index 0000000..ebb02fc
--- /dev/null
@@ -0,0 +1,59 @@
+#!/bin/sh -
+#
+# $Id: tmdecode,v 1.4 1997/01/30 02:22:30 steve Exp $
+#
+# Copyright 1994, 1995, 1996 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 GNU Emacs; see the file COPYING.  If not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+PATH=${PATH:-/usr/bin:/bin}:`dirname $0 2>/dev/null`; export PATH
+
+trap 'rm -f $2' 0 1 2 3 13 15
+
+case "$3" in
+/dev/stdout)
+       OUTPUT=
+       ;;
+*)
+       OUTPUT='> $3'
+       ;;
+esac
+
+case "$1" in
+""|"7bit"|"8bit"|"binary")
+       eval "cat $2 $OUTPUT"
+       ;;
+"base64")
+       #eval "decode-b < $2 $OUTPUT"
+       eval "mmencode -u $2 $OUTPUT"
+       ;;
+"quoted-printable")
+       eval "mmencode -q -u $2 $OUTPUT"
+       ;;
+"x-uue"|"x-uuencode")
+       (cd $TM_TMP_DIR ; uudecode $2)
+       ;;
+"x-gzip64")
+       #eval "decode-b < $2 | gzip -cd $OUTPUT"
+       eval "mmencode -u $2 | gzip -cd $OUTPUT"
+       ;;
+*)
+       echo "unknown encoding"
+       exit -1
+       ;;
+esac
+
+# echo "$2 was removed."
diff --git a/lib-src/update-elc.sh b/lib-src/update-elc.sh
new file mode 100644 (file)
index 0000000..f0cfc45
--- /dev/null
@@ -0,0 +1,183 @@
+#!/bin/sh
+# update-elc.sh --- recompile all missing or out-of-date .elc files
+
+# Author:      Jamie Zawinski, Ben Wing, Martin Buchholz
+# Maintainer:  Martin Buchholz
+# Keywords:    recompile byte-compile .el .elc
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+### Commentary:
+##  Recompile all .elc files that need recompilation.  Requires a
+##  working version of "xemacs".  Correctly handles the case where the
+##  .elc files are missing; thus you can execute "rm lisp/*/*.elc"
+##  before running this script.  Run this from the parent of the
+##  "lisp" directory, or another nearby directory.
+
+set -e
+
+# Try to find the lisp directory in several places.
+# (Sun workspaces have an "editor" directory)
+for dir in  .  ..  ../..  editor  ../editor  ; do
+  if test -d $dir/lisp/. ; then cd $dir ; break ; fi
+done
+
+if test ! -d lisp/. ; then
+  echo "$0: Cannot find the \"lisp\" directory."
+  exit 1
+fi
+
+if test -z "$EMACS"; then EMACS="./src/xemacs"; fi
+export EMACS
+
+echo " (using $EMACS)"
+
+# fuckin' sysv, man...
+if [ "`uname -r | sed 's/[^0-9]*\([0-9]*\).*/\1/'`" -gt 4 ]; then
+  echon()
+  {    
+    /bin/echo $* '\c'
+  }
+else
+  echon()
+  {
+    echo -n $*
+  }
+fi
+
+REAL=`cd \`dirname $EMACS\` ; pwd | sed 's|^/tmp_mnt||'`/`basename $EMACS`
+BYTECOMP="$REAL -batch -vanilla "
+echo "Recompiling in `pwd|sed 's|^/tmp_mnt||'`"
+echo "          with $REAL..."
+
+$EMACS -batch -vanilla -l `pwd`/lisp/cleantree -f batch-remove-old-elc lisp
+
+prune_vc="( -name '.*' -o -name SCCS -o -name RCS -o -name CVS ) -prune -o"
+
+# $els  is a list of all .el  files
+# $elcs is a list of all .elc files
+els=/tmp/update-elc-1.$$ elcs=/tmp/update-elc-2.$$
+rm -f $els $elcs
+trap "rm -f $els $elcs" 0 1 2 3 15
+find lisp/. $prune_vc -name '*.el'  -print                    | sort > $els
+find lisp/. $prune_vc -name '*.elc' -print | sed 's/elc$/el/' | sort > $elcs
+
+
+echon "Deleting .elc files without .el files..."
+comm -13 $els $elcs | sed -e '\!/vm.el!d' -e 's/el$/elc/' | \
+ while read file ; do echo rm "$file" ; rm "$file" ; done
+echo done.
+
+
+# Compute patterns to ignore when searching for files
+ignore_dirs=""
+ignore_pattern=''
+
+# Only use Mule XEmacs to compile Mule-specific elisp dirs
+echon "Checking for Mule support..."
+lisp_prog='(princ (featurep (quote mule)))'
+mule_p="`$EMACS -batch -vanilla -eval \"$lisp_prog\"`"
+if test "$mule_p" = nil ; then
+       echo No
+       ignore_dirs="$ignore_dirs its egg mule language leim skk"
+       ignore_pattern='\!/tl/char-table.el$!d
+\!/tl/chartblxmas.el$!d
+\!/mu/latex-math-symbol.el$!d
+'
+else
+  echo Yes
+fi
+
+# first recompile the byte-compiler, so that the other compiles take place
+# with the latest version (assuming we're compiling the lisp dir of the emacs
+# we're running, which might not be the case, but often is.)
+#echo "Checking the byte compiler..."
+#$BYTECOMP -f batch-byte-recompile-directory lisp/bytecomp
+
+# Prepare for byte-compiling directories with directory-specific instructions
+# Not necessary any more, but I want to keep the text current to cut & paste
+# into the package lisp maintenance tree.
+#make_special_commands=''
+#make_special () {
+#  dir="$1"; shift;
+#  ignore_dirs="$ignore_dirs $dir"
+#  make_special_commands="$make_special_commands \
+#echo \"Compiling in lisp/$dir\"; \
+#(cd \"lisp/$dir\" && ${MAKE:-make} EMACS=$REAL ${1+$*}); \
+#echo \"lisp/$dir done.\";"
+#}
+
+#if test "$mule_p" != nil; then
+#      make_special skk all
+#fi
+
+## AUCTeX is a package now
+# if test "$mule_p" = nil ; then
+#      make_special auctex some
+# else
+#      make_special auctex some MULE_ELC=tex-jp.elc
+# fi
+#make_special cc-mode all
+# EFS is now packaged
+# make_special efs x20
+#make_special eos -k           # not strictly necessary...
+## make_special gnus  some     # Now this is a package.
+# hyperbole is now packaged
+# make_special hyperbole elc
+# We're not ready for the following, yet.
+#make_special ilisp XEmacsELC=custom-load.elc elc
+# ilisp is now packaged
+# make_special ilisp elc
+# oobr is now packaged
+# make_special oobr HYPB_ELC='' elc
+## W3 is a package now.
+#make_special w3 xemacs-w3
+
+for dir in $ignore_dirs ; do
+  ignore_pattern="${ignore_pattern}/\\/$dir\\//d
+/\\/$dir\$/d
+"
+done
+
+# Other special-case filenames that don't get byte-compiled
+ignore_pattern="$ignore_pattern"'
+\!/,!d
+\!/paths.el$!d
+\!/loadup.el$!d
+\!/loadup-el.el$!d
+\!/update-elc.el$!d
+\!/dumped-lisp.el$!d
+\!/make-docfile.el$!d
+\!/site-start.el$!d
+\!/site-load.el$!d
+\!/site-init.el$!d
+\!/version.el$!d
+\!/very-early-lisp.el$!d
+\!/Installation.el$!d
+'
+
+echo "Compiling files without .elc..."
+NUMTOCOMPILE=20                        # compile this many files with each invocation
+comm -23 $els $elcs | \
+ sed "$ignore_pattern" | \
+ xargs -t -n$NUMTOCOMPILE $BYTECOMP -f batch-byte-compile
+echo "Compiling files without .elc... Done"
+
+#if test "$mule_p" != nil; then
+#      eval "$make_special_commands"
+#fi
index 6cca999..c2f1b30 100644 (file)
@@ -1,317 +1,3 @@
-1998-09-29  SL Baur  <steve@altair.xemacs.org>
-
-       * XEmacs 21.2-beta2 is released.
-
-1998-08-14  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * files.el (auto-mode-alist): Enhanced regexp for perl-mode
-
-1998-09-22  Karl M. Hegbloom  <karlheg@bittersweet.inetarena.com>
-
-       * info.el (Info-mode): Document page turning by double clicks in
-       docstring so `M-x describe-mode' will display it.
-
-1998-09-20  Karl M. Hegbloom  <karlheg@bittersweet.inetarena.com>
-
-       * info.el (Info-mouse-track-double-click-hook): Use character
-       widths to calculate a border region where double clicking does
-       page turning, and return `nil' by default so other hooks, such as
-       region highlighting, will be run.
-
-1998-09-29  Colin Rafferty   <colin@xemacs.org>
-
-       * sound.el (default-sound-directory-list): Initialize with all the 
-       "sounds" directories in `data-directory-list'.  It used to just be 
-       the first one.
-
-       * packages.el (locate-data-directory-list): Created.  This gives
-       the list of matching directories, unlike `locate-data-directory',
-       which just gives the first one.
-
-1998-09-26  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * minibuf.el (read-from-minibuffer): No longer bind help-form but
-       make a binding in the local keymap until help-char handling is
-       improved. 
-
-       * help.el (help-keymap-with-help-key): Provide keymap with help
-       binding.
-       (help-print-help-form): New helper function.
-
-1998-09-23  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * isearch-mode.el (isearch-highlight): set-extent-endpoints can
-       move extent to another buffer; no need to create a new extent.
-       (isearch-fix-case): New function.
-       (isearch-search-and-update): Use it.
-
-1998-09-22  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * isearch-mode.el (isearch-mode): Use overriding-local-map to set
-       the keymap, not minor-mode-map-alist.
-       (isearch-done): Restore overriding-local-map.
-
-1998-09-21  Martin Buchholz  <martin@xemacs.org>
-
-       * bytecomp.el (byte-compile-buffer-substring): 
-       Fix for: (byte-compile (defun f () (buffer-substring)))
-       ==>   ** buffer-substring called with 3 args, but requires 0-3
-       - new code not only works, but is more readable, too.
-
-1998-09-20  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * msw-faces.el (mswindows-init-device-faces): Don't try to
-         specify a default font at this late stage. Do try to force
-         creation of the default face font so that if it fails we get
-         an error now instead of a crash at frame creation.
-
-         mswindows-font-canonicalize-name, mswindows-make-font-unbold,
-         mswindows-make-font-unitalic: Canonical default weight
-         changed from "Normal" to "Regular".
-
-         mswindows-make-font-bold / -bold-italic: Supplied device was
-         not being passed into call to mswindows-find-smaller-font.
-
-1998-09-10  Björn Torkelsson  <torkel@hpc2n.umu.se>
-
-       * package-get.el (package-get-remote): Fix the path where to find
-         the packages on xemacs.org.
-
-1998-09-08  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * about.el (about-maintainer-info): Update Ben's entry.
-
-1998-09-24  Martin Buchholz  <martin@xemacs.org>
-
-       * lisp/shadow.el (find-emacs-lisp-shadows):
-       - `member' was being called on lists of length 2000!
-       - Replace with hashtables.
-       - Replace hand-coded loops with (dolist)
-       - Fix comment typo
-
-1998-09-20  Darryl Okahata  <darrylo@sr.hp.com>
-
-       * packages.el: Added new function, `package-delete-name', to
-         delete existing packages from the installed package database
-         (`packages-package-list').  Also added the "pkginfo" directory
-         to `packages-special-base-regexp', so that the pkginfo directory
-         would not get added to `late-packages'.
-
-       * package-admin.el: Added ability to delete an installed package
-         (added low-level function, `package-admin-delete-package').
-         Understands how to use the pkginfo/MANIFEST.<package> file to
-         delete the package.  When installing a package, will also
-         create a MANIFEST.* file if one is not provided by the
-         package.  If the MANIFEST.* doesn't exist when deleting a
-         package, the functions will fall back to attempting to delete
-         any package-specific lisp directory.
-
-       * package-get.el: Moved some functions to package-admin.el.
-         Added interactive function `package-get-delete-package', for
-         use by users for deleting a package.
-
-         Also modified to not require the prescence of efs.
-
-1998-09-22  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * files.el (find-file-noselect): Handle all signals, kill the
-       buffer and resignal.
-
-1998-09-23  SL Baur  <steve@altair.xemacs.org>
-
-       * cl-macs.el (glyph-image): Add setf method.
-
-1998-09-06  Darryl Okahata  <darrylo@sr.hp.com>
-
-       * package-get.el: Fixed broken EFS downloading.  Also, look for
-         .tar.gz files first, in preference over .tgz files.
-
-       * package-ui.el: Fix display of package version numbers.
-
-1998-08-27  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * x-font-menu.el (font-menu-set-font):  Add "pt" units to size
-       argument.       
-
-1998-09-03  Darryl Okahata  <darrylo@sr.hp.com>
-
-       * list-mode.el: `display-completion-list': added new/optional
-         keyword `:completion-string', which allows the programmer to
-         change the "Possible completions are:" prompt.
-
-       * menubar-items.el: Added new pulldown menu-pick to start up the 
-         visual package browser/installer:
-
-               Options->Customize->List Packages
-
-       * package-admin.el: Added hooks for installing under both Unix
-         and MS Windows.  Does additional error checking.  No longer
-         calls "add-big-package.sh" to install packages under Unix; now 
-         calls gunzip & tar directly.
-
-       * package-get.el: Added ability to install packages from files
-         on a local disk/CDROM.  Now deletes any existing package lisp
-         directory.  Does completion on available packages when
-         querying for package names.  Will also search for .tgz files
-         in addition for .tar.gz files.  Tries to reload
-         auto-autoloads, as a convenience when loading new packages,
-         and also tries to add any new package paths to `load-path'.
-         Changed all occurences of `concat' to use `expand-file-name'.
-
-       * package-ui.el: New file which implements the main visual
-         package browser/installer, which is started via a menu pick or 
-         M-x pui-list packages.
-
-1998-09-03  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * startup.el (load-init-file): spelling fix.
-
-1998-09-02  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * startup.el (normal-top-level): Load auto-autoload files
-       covariantly with their precedence.
-
-1998-08-26  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * menubar-items.el (default-menubar): Remove "Font Weight"
-       option, there is currently no custom equivalent.. Customize-faces
-       is "Edit faces".
-
-       * x-font-menu.el (font-menu-set-font): Use customize to set
-       default face.
-
-       * faces.el (face-spec-update-all-matching): New function.
-
-       * cus-face.el (custom-set-face-update-spec): New function.
-       Interface to customize faces from elisp.
-
-       (custom-face-value-create): Show the customized settings if set
-       but not saved.
-
-1998-08-26  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       (custom-face-value-create): Show the customized settings if set
-       but not saved.
-
-1998-08-31  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * keydefs.el (global-map): Add FSF 20.3 binding of
-       query-replace-regexp.
-
-1998-08-21  Greg Klanderman  <greg@alphatech.com>
-
-       * minibuf.el (read-file-name-internal-1): use
-       user-name-completion-1 instead of user-name-completion.
-
-1998-08-19  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * loadup.el: 
-       * make-docfile.el: 
-       * update-elc.el: Don't set `source-directory' (now defunct as a
-       global variable) no more.
-
-       * packages.el (packages-list-autoloads): Made `source-directory'
-       (now defunct as a global variable) a parameter.
-
-1998-08-13  Carsten Leonhardt  <leo@arioch.oche.de>
-
-       * about.el (about-hackers): new email
-
-1998-08-16  SL Baur  <steve@altair.xemacs.org>
-
-       * lisp-mode.el (with-string-as-buffer-contents): Set indentation.
-
-1998-07-17  Didier Verna  <verna@inf.enst.fr>
-
-       * faces.el (set-face-property):
-       (set-face-dim-p):
-       (face-dim-p): updated the doc strings now that the dim property isn't
-       tty-specific. 
-       (face-equal): the dim property is now a common one.
-
-       * cus-face.el (custom-face-attributes): New face attribute: `dim'
-       Renamed the `stipple' attribute to `background-pixmap'.
-       (custom-face-background-pixmap): make custom-face-stipple an
-       obsolete alias for this.
-
-1998-08-11  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * find-paths.el (paths-file-readable-directory-p): Created and
-       used.
-
-       * loadup.el: Don't set inhibit-... flags from run-temacs.
-
-1998-08-06  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * packages.el (packages-data-path-depth): Added and used.
-
-1998-08-05  Charles G. Waldman <cgw@pgt.com>
-
-       * about.el:
-       - Change .xpm to .png, delete "zcat" section.
-       - cosmetic fix in the 'marcpa' entry.
-
-       * etc/photos
-       - convert all .xpm.Z to .png
-       - rename mrb to martin
-       - rename mcook-m to mcookm
-
-1998-07-31  Martin Buchholz  <martin@xemacs.org>
-
-       * x-init.el (x-initialize-compose): Add support for
-       dead-circumflex as YET ANOTHER NAME for that dead key.
-
-1998-08-05  Colin Rafferty <colin@xemacs.org>
-
-       * setup-paths.el (paths-construct-exec-path): Made the
-       last-packages really be last.
-       (paths-construct-data-directory-list): Ditto.
-
-1998-08-01  Kai Haberzettl  <khaberz@synnet.de>
-
-       * startup.el(startup-splash-frame-body): 
-       Update Copyright notice in splash screen 
-
-1998-07-20  Greg Klanderman  <greg@alphatech.com>
-
-       * minibuf.el (read-file-name-internal-1): do ~user completion.
-
-1998-07-22  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * font-lock.el (font-lock-fontify-glumped-region): Add guard
-       aginst destroyed extents
-
-1998-07-24  Greg Klanderman  <greg@alphatech.com>
-
-       * package-get.el (package-get): add `install-dir' argument.
-
-1998-07-20  John Jones  <jj@asu.edu>
-
-       * package-get.el: calls to package-get-update-all will only
-         update packages which are already installed.
-
-1998-07-23  SL Baur  <steve@altair.xemacs.org>
-
-       * autoload.el (update-file-autoloads): Ensure autoloads buffer is
-       writable.
-
-1998-07-20  Colin Rafferty   <colin@xemacs.org>
-
-       * about.el (about-hackers): Correct my email.
-
-1998-07-20  Kai Haberzettl  <khaberz@synnet.de>
-
-       * about.el (about-hackers): new email-address.
-
-1998-07-25  SL Baur  <steve@altair.xemacs.org>
-
-       * minibuf.el (read-number): Don't let `input-error' condition
-       escape.
-
-1998-07-20  Greg Klanderman  <greg@alphatech.com>
-
-       * about.el (about-hackers): use my `email-for-life' address.
-
 1998-07-19  SL Baur  <steve@altair.xemacs.org>
 
        * XEmacs 21.2-beta1 is released.
index 59692fc..55a4534 100644 (file)
@@ -1214,9 +1214,7 @@ Fetch PACKAGE with VERSION and all other required packages.
 Uses `package-get-base' to determine just what is required and what
 package provides that functionality.  If VERSION is nil, retrieves
 latest version.  Optional argument FETCHED-PACKAGES is used to keep
-track of packages already fetched.
-
-Returns nil upon error." t nil)
+track of packages already fetched." t nil)
 
 (autoload 'package-get "package-get" "\
 Fetch PACKAGE from remote site.
@@ -1225,8 +1223,6 @@ means most recent version.  CONFLICT indicates what happens if the
 package is already installed.  Valid values for CONFLICT are:
 'always        always retrieve the package even if it is already installed
 'never do not retrieve the package if it is installed.
-INSTALL-DIR, if non-nil, specifies the package directory where
-fetched packages should be installed.
 
 The value of `package-get-base' is used to determine what files should 
 be retrieved.  The value of `package-get-remote' is used to determine
@@ -1235,11 +1231,7 @@ order so one is better off listing easily reached sites first.
 
 Once the package is retrieved, its md5 checksum is computed.  If that
 sum does not match that stored in `package-get-base' for this version
-of the package, an error is signalled.
-
-Returns `t' upon success, the symbol `error' if the package was
-successfully installed but errors occurred during initialization, or
-`nil' upon error." t nil)
+of the package, an error is signalled." t nil)
 
 (autoload 'package-get-package-provider "package-get" "\
 Search for a package that provides SYM and return the name and
@@ -1252,23 +1244,6 @@ Fetch and install the latest versions of all customized packages." t nil)
 
 ;;;***
 \f
-;;;### (autoloads (pui-list-packages pui-add-install-directory) "package-ui" "lisp/package-ui.el")
-
-(autoload 'pui-add-install-directory "package-ui" "\
-Add a new package binary directory to the head of `package-get-remote'.
-Note that no provision is made for saving any changes made by this function.
-It exists mainly as a convenience for one-time package installations from
-disk." t nil)
-
-(autoload 'pui-list-packages "package-ui" "\
-List all packages and package information.
-The package name, version, and description are displayed.  From the displayed
-buffer, the user can see which packages are installed, which are not, and
-which are out-of-date (a newer version is available).  The user can then
-select packages for installation via the keyboard or mouse." t nil)
-
-;;;***
-\f
 ;;;### (autoloads (picture-mode) "picture" "lisp/picture.el")
 
 (autoload 'picture-mode "picture" "\
index 4e0bd04..95bce46 100644 (file)
@@ -3125,15 +3125,15 @@ If FORM is a lambda or a macro, byte-compile it as a function."
          (t (byte-compile-normal-call form)))))
 
 (defun byte-compile-buffer-substring (form)
-  ;; buffer-substring used to take exactly two args, but now takes 0-3.
-  ;; convert 0-2 to two args and use special bytecode operand.
-  ;; convert 3 args to a normal call.
-  (case (length (cdr form))
-    (0 (byte-compile-two-args (append form '(nil nil))))
-    (1 (byte-compile-two-args (append form '(nil))))
-    (2 (byte-compile-two-args form))
-    (3 (byte-compile-normal-call form))
-    (t (byte-compile-subr-wrong-args form "0-3"))))
+  (let ((len (length form)))
+    ;; buffer-substring used to take exactly two args, but now takes 0-3.
+    ;; convert 0-2 to two args and use special bytecode operand.
+    ;; convert 3 args to a normal call.
+    (cond ((= len 1) (setq form (append form '(nil nil)))
+          (= len 2) (setq form (append form '(nil)))))
+    (cond ((= len 3) (byte-compile-two-args form))
+         ((= len 4) (byte-compile-normal-call form))
+         (t (byte-compile-subr-wrong-args form "0-3")))))
 
 (defun byte-compile-list (form)
   (let ((count (length (cdr form))))
index 6e38ac8..d4da910 100644 (file)
@@ -72,8 +72,7 @@
 (custom-add-loads 'isearch '("isearch-mode"))
 (custom-add-loads 'font-lock-faces '("font-lock"))
 (custom-add-loads 'modeline '("modeline"))
-(custom-add-loads 'packages '("package-get-custom"))
-(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "cus-edit" "dragdrop"))
+(custom-add-loads 'editing '("simple" "abbrev" "fill" "mouse" "dragdrop" "cus-edit"))
 (custom-add-loads 'matching '("simple" "isearch-mode" "hyper-apropos"))
 (custom-add-loads 'i18n '("cus-edit"))
 (custom-add-loads 'info '("toolbar-items" "info"))
index 2c288c3..591648d 100644 (file)
@@ -976,69 +976,65 @@ If RAWFILE is non-nil, the file is read literally."
 ;;;            (message "Symbolic link to file in buffer %s"
 ;;;                     (buffer-name linked-buf))))
          (setq buf (create-file-buffer filename))
-         ;; Catch various signals, such as QUIT, and kill the buffer
-         ;; in that case.
-         (condition-case data
-             (progn
-               (set-buffer-major-mode buf)
-               (set-buffer buf)
-               (erase-buffer)
-               (condition-case ()
-                   (if rawfile
-                       (insert-file-contents-literally filename t)
-                     (insert-file-contents filename t))
-                 (file-error
-                  (when (and (file-exists-p filename)
-                             (not (file-readable-p filename)))
-                    (signal 'file-error (list "File is not readable" filename)))
-                  (if rawfile
-                      ;; Unconditionally set error
-                      (setq error t)
-                    (or
-                     ;; Run find-file-not-found-hooks until one returns non-nil.
-                     (run-hook-with-args-until-success 'find-file-not-found-hooks)
-                     ;; If they fail too, set error.
-                     (setq error t)))))
-               ;; Find the file's truename, and maybe use that as visited name.
-               ;; automatically computed in XEmacs, unless jka-compr was used!
-               (unless buffer-file-truename
-                 (setq buffer-file-truename truename))
-               (setq buffer-file-number number)
-               ;; On VMS, we may want to remember which directory in
-               ;; a search list the file was found in.
-               (and (eq system-type 'vax-vms)
-                    (let (logical)
-                      (if (string-match ":" (file-name-directory filename))
-                          (setq logical (substring (file-name-directory filename)
-                                                   0 (match-beginning 0))))
-                      (not (member logical find-file-not-true-dirname-list)))
-                    (setq buffer-file-name buffer-file-truename))
-               (and find-file-use-truenames
-                    ;; This should be in C.  Put pathname
-                    ;; abbreviations that have been explicitly
-                    ;; requested back into the pathname.  Most
-                    ;; importantly, strip out automounter /tmp_mnt
-                    ;; directories so that auto-save will work
-                    (setq buffer-file-name (abbreviate-file-name buffer-file-name)))
-               ;; Set buffer's default directory to that of the file.
-               (setq default-directory (file-name-directory buffer-file-name))
-               ;; Turn off backup files for certain file names.  Since
-               ;; this is a permanent local, the major mode won't eliminate it.
-               (and (not (funcall backup-enable-predicate buffer-file-name))
-                    (progn
-                      (make-local-variable 'backup-inhibited)
-                      (setq backup-inhibited t)))
-               (if rawfile
-                   ;; #### FSF 20.3 sets buffer-file-coding-system to
-                   ;; `no-conversion' here.  Should we copy?  It also
-                   ;; makes `find-file-literally' a local variable
-                   ;; and sets it to t.
-                   nil
-                 (after-find-file error (not nowarn))
-                 (setq buf (current-buffer))))
-           (t
-            (kill-buffer buf)
-            (signal (car data) (cdr data))))))
+         (set-buffer-major-mode buf)
+         (set-buffer buf)
+         (erase-buffer)
+         (if rawfile
+             (condition-case ()
+                 (insert-file-contents-literally filename t)
+               (file-error
+                (when (and (file-exists-p filename)
+                           (not (file-readable-p filename)))
+                  (kill-buffer buf)
+                  (signal 'file-error (list "File is not readable" filename)))
+                ;; Unconditionally set error
+                (setq error t)))
+           (condition-case ()
+               (insert-file-contents filename t)
+             (file-error
+              (when (and (file-exists-p filename)
+                         (not (file-readable-p filename)))
+                (kill-buffer buf)
+                (signal 'file-error (list "File is not readable" filename)))
+              ;; Run find-file-not-found-hooks until one returns non-nil.
+              (or (run-hook-with-args-until-success 'find-file-not-found-hooks)
+                  ;; If they fail too, set error.
+                  (setq error t)))))
+         ;; Find the file's truename, and maybe use that as visited name.
+         ;; automatically computed in XEmacs, unless jka-compr was used!
+         (unless buffer-file-truename
+           (setq buffer-file-truename truename))
+         (setq buffer-file-number number)
+         ;; On VMS, we may want to remember which directory in a search list
+         ;; the file was found in.
+         (and (eq system-type 'vax-vms)
+              (let (logical)
+                (if (string-match ":" (file-name-directory filename))
+                    (setq logical (substring (file-name-directory filename)
+                                             0 (match-beginning 0))))
+                (not (member logical find-file-not-true-dirname-list)))
+              (setq buffer-file-name buffer-file-truename))
+         (and find-file-use-truenames
+              ;; This should be in C.  Put pathname abbreviations that have
+              ;; been explicitly requested back into the pathname.  Most
+              ;; importantly, strip out automounter /tmp_mnt directories so
+              ;; that auto-save will work
+              (setq buffer-file-name (abbreviate-file-name buffer-file-name)))
+         ;; Set buffer's default directory to that of the file.
+         (setq default-directory (file-name-directory buffer-file-name))
+         ;; Turn off backup files for certain file names.  Since
+         ;; this is a permanent local, the major mode won't eliminate it.
+         (and (not (funcall backup-enable-predicate buffer-file-name))
+              (progn
+                (make-local-variable 'backup-inhibited)
+                (setq backup-inhibited t)))
+         (if rawfile
+             ;; #### FSF 20.3 sets buffer-file-coding-system to
+             ;; `no-conversion' here.  Should we copy?  It also makes
+             ;; `find-file-literally' a local variable and sets it to t.
+             nil
+           (after-find-file error (not nowarn))
+           (setq buf (current-buffer)))))
       buf)))
 \f
 ;; FSF has `insert-file-literally' and `find-file-literally' here.
@@ -1158,7 +1154,7 @@ run `normal-mode' explicitly."
     ("\\.[fF]90\\'" . f90-mode)
 ;;; Less common extensions come here
 ;;; so more common ones above are found faster.
-    ("\\.\\([pP][Llm]\\|al\\)\\'" . perl-mode)
+    ("\\.p[lm]\\'" . perl-mode)
     ("\\.py\\'" . python-mode)
     ("\\.texi\\(nfo\\)?\\'" . texinfo-mode)
     ("\\.ad[abs]\\'" . ada-mode)
diff --git a/lisp/finder-inf.el b/lisp/finder-inf.el
new file mode 100644 (file)
index 0000000..6c5365a
--- /dev/null
@@ -0,0 +1,3677 @@
+;;; finder-inf.el --- keyword-to-package mapping
+;; Keywords: help
+;;; Commentary:
+;; Don't edit this file.  It's generated by finder.el
+
+;;; Code:
+
+(defconst finder-package-info '(
+    ("eos.el"
+        "Intereactively loads the XEmacs/SPARCworks interface"
+        (sparcworks eos era on sparcworks load)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sccs.el"
+        "easy-to-use SCCS control from within Emacs"
+        nil
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-browser.el"
+        "Implements the XEmacs/SPARCworks SourceBrowser interface"
+        (sparcworks eos era on sparcworks sbrowser source browser)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-debugger-extra.el"
+        "Implements the XEmacs/SPARCworks Debugger interface"
+        (sparcworks eos era on sparcworks debugger dbx)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-debugger.el"
+        "Implements the XEmacs/SPARCworks interface"
+        (sparcworks eos era on sparcworks debugger dbx)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-editor.el"
+        "Implements the XEmacs/SPARCworks editor protocol"
+        (sparcworks eos era on sparcworks editor)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-init.el"
+        "Initializes the XEmacs/SPARCworks interface"
+        (sparcworks eos era on sparcworks initialize)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-load.el"
+        "Loads the XEmacs/SPARCworks interface code"
+        (sparcworks eos era on sparcworks debugger dbx)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-menubar.el"
+        "Implements the XEmacs/SPARCworks menubar"
+        (sparcworks eos era on sparcworks menubar)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos-toolbar.el"
+        "Implements the EOS toolbar interface"
+        (sparcworks eos era on sparcworks toolbar)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sun-eos.el"
+        "Intereactively loads the XEmacs/SPARCworks interface"
+        (sparcworks eos era on sparcworks load)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sunpro-keys.el"
+        "SunPro-specific key bindings"
+        nil
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sunpro-menubar.el"
+        "Initialize the SunPro menubar"
+        (sunpro menubar initialization)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("sunpro-sparcworks.el"
+        "support SPARCworks manager ToolTalk messages"
+        (sparcworks  tooltalk  messages)
+        "/home/martin/x/packages/lisp/Sun/")
+    ("ada-mode.el"
+        "An Emacs major-mode for editing Ada source."
+        (languages oop ada)
+        "/home/martin/x/packages/lisp/ada/")
+    ("custom-load.el"
+        "automatically extracted custom dependencies"
+        nil
+        "/home/martin/x/packages/lisp/ada/")
+    ("atype.el"
+        "atype functions"
+        (atype)
+        "/home/martin/x/packages/lisp/apel/")
+    ("emu-20.el"
+        "emu API implementation for Emacs 20 and XEmacs/mule"
+        (emulation  compatibility  mule)
+        "/home/martin/x/packages/lisp/apel/")
+    ("emu-e19.el"
+        "emu module for Emacs 19 and XEmacs 19"
+        (emulation  compatibility  mule  latin-1)
+        "/home/martin/x/packages/lisp/apel/")
+    ("emu-x20.el"
+        "emu API implementation for XEmacs with mule"
+        (emulation  compatibility  mule  xemacs)
+        "/home/martin/x/packages/lisp/apel/")
+    ("emu-xemacs.el"
+        "emu API implementation for XEmacs"
+        (emulation  compatibility  xemacs)
+        "/home/martin/x/packages/lisp/apel/")
+    ("emu.el"
+        "Emulation module for each Emacs variants"
+        (emulation  compatibility  nemacs  mule  emacs/mule  xemacs)
+        "/home/martin/x/packages/lisp/apel/")
+    ("file-detect.el"
+        "Path management or file detection utility"
+        (file detection  install  module)
+        "/home/martin/x/packages/lisp/apel/")
+    ("filename.el"
+        "file name filter"
+        (file name  string)
+        "/home/martin/x/packages/lisp/apel/")
+    ("install.el"
+        "Emacs Lisp package install utility"
+        (install  byte-compile  directory detection)
+        "/home/martin/x/packages/lisp/apel/")
+    ("mule-caesar.el"
+        "ROT 13-47 Caesar rotation utility"
+        (rot 13-47  caesar  mail  news  text/x-rot13-47)
+        "/home/martin/x/packages/lisp/apel/")
+    ("path-util.el"
+        "Emacs Lisp file detection utility"
+        (file detection  install  module)
+        "/home/martin/x/packages/lisp/apel/")
+    ("richtext.el"
+        "read and save files in text/richtext format"
+        (wp  faces  mime  multimedia)
+        "/home/martin/x/packages/lisp/apel/")
+    ("std11-parse.el"
+        "STD 11 parser for GNU Emacs"
+        (mail  news  rfc 822  std 11)
+        "/home/martin/x/packages/lisp/apel/")
+    ("std11.el"
+        "STD 11 functions for GNU Emacs"
+        (mail  news  rfc 822  std 11)
+        "/home/martin/x/packages/lisp/apel/")
+    ("font-latex.el"
+        "LaTeX fontification for Font Lock mode."
+        (latex faces)
+        "/home/martin/x/packages/lisp/auctex/")
+    ("latex.el"
+        "Support for LaTeX documents."
+        (wp)
+        "/home/martin/x/packages/lisp/auctex/")
+    ("multi-prompt.el"
+        "completing read of multiple strings."
+        (extensions)
+        "/home/martin/x/packages/lisp/auctex/")
+    ("tex.el"
+        "Support for TeX documents."
+        (wp)
+        "/home/martin/x/packages/lisp/auctex/")
+    ("bbdb-print.el"
+        "for printing BBDB databases using TeX."
+        nil
+        "/home/martin/x/packages/lisp/bbdb/")
+    ("bbdb-reportmail.el"
+        "Hooks the Insidious Big Brother Database"
+        nil
+        "/home/martin/x/packages/lisp/bbdb/")
+    ("bbdb-snarf.el"
+        "convert free-form text to BBDB records"
+        nil
+        "/home/martin/x/packages/lisp/bbdb/")
+    ("bbdb-whois.el"
+        "Big Brother gets a little help from Big Brother"
+        nil
+        "/home/martin/x/packages/lisp/bbdb/")
+    ("c-comment-edit.el"
+        "edit C comments"
+        (languages)
+        "/home/martin/x/packages/lisp/c-support/")
+    ("c-comment.el"
+        "edit C comments"
+        (languages)
+        "/home/martin/x/packages/lisp/c-support/")
+    ("c-style.el"
+        "sets c-style control variables."
+        nil
+        "/home/martin/x/packages/lisp/c-support/")
+    ("cmacexp.el"
+        "expand C macros in a region"
+        (c)
+        "/home/martin/x/packages/lisp/c-support/")
+    ("ctypes.el"
+        "Enhanced Font lock support for custom defined types."
+        nil
+        "/home/martin/x/packages/lisp/c-support/")
+    ("hideif.el"
+        "hides selected code within ifdef."
+        (c  outlines)
+        "/home/martin/x/packages/lisp/c-support/")
+    ("hideshow.el"
+        "minor mode cmds to selectively display blocks of code"
+        (c c++ lisp tools editing)
+        "/home/martin/x/packages/lisp/c-support/")
+    ("appt.el"
+        "appointment notification functions."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-china.el"
+        "calendar functions for the Chinese calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-coptic.el"
+        "calendar functions for the Coptic/Ethiopic calendars."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-dst.el"
+        "calendar functions for daylight savings rules."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-french.el"
+        "calendar functions for the French Revolutionary calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-hebrew.el"
+        "calendar functions for the Hebrew calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-islam.el"
+        "calendar functions for the Islamic calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-iso.el"
+        "calendar functions for the ISO calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-julian.el"
+        "calendar functions for the Julian calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-mayan.el"
+        "calendar functions for the Mayan calendars."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-move.el"
+        "calendar functions for movement in the calendar"
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-persia.el"
+        "calendar functions for the Persian calendar."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-tex.el"
+        "calendar functions for printing calendars with LaTeX."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-x.el"
+        "calendar windows in dedicated frames in x-windows"
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cal-xemacs.el"
+        "calendar functions for menu bar and popup menu support"
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("calendar.el"
+        "Calendar functions.  -*-byte-compile-dynamic: t;-*-"
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("diary-lib.el"
+        "diary functions."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("holidays.el"
+        "holiday functions for the calendar package"
+        (holidays  calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("lunar.el"
+        "calendar functions for phases of the moon."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("solar.el"
+        "calendar functions for solar events."
+        (calendar)
+        "/home/martin/x/packages/lisp/calendar/")
+    ("cc-align.el"
+        "custom indentation functions for CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-cmds.el"
+        "user level commands for CC Mode "
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-compat.el"
+        "cc-mode compatibility with c-mode.el confusion"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-defs.el"
+        "compile time definitions for CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-engine.el"
+        "core syntax guessing engine for CC mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-langs.el"
+        "specific language support for CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-menus.el"
+        "imenu support for CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-mode.el"
+        "major mode for editing C, C++, Objective-C, and Java code"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-styles.el"
+        "support for styles in CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cc-vars.el"
+        "user customization variables for CC Mode"
+        (c languages oop)
+        "/home/martin/x/packages/lisp/cc-mode/")
+    ("cookie1.el"
+        "retrieve random phrases from fortune cookie files"
+        (games)
+        "/home/martin/x/packages/lisp/cookie/")
+    ("spook.el"
+        "spook phrase utility for overloading the NSA line eater"
+        (games)
+        "/home/martin/x/packages/lisp/cookie/")
+    ("yow.el"
+        "quote random zippyisms"
+        (games)
+        "/home/martin/x/packages/lisp/cookie/")
+    ("crisp.el"
+        "CRiSP/Brief Emacs emulator"
+        (emulations brief crisp)
+        "/home/martin/x/packages/lisp/crisp/")
+    ("scroll-lock.el"
+        "scroll-locking minor mode"
+        (scroll crisp brief lock)
+        "/home/martin/x/packages/lisp/crisp/")
+    ("dbx.el"
+        "run dbx under Emacs"
+        (c  unix  tools  debugging)
+        "/home/martin/x/packages/lisp/debug/")
+    ("gdb-highlight.el"
+        "make gdb buffers be mouse-sensitive."
+        (extensions  c  unix  tools  debugging)
+        "/home/martin/x/packages/lisp/debug/")
+    ("gdb.el"
+        "run gdb under Emacs"
+        (c  unix  tools  debugging)
+        "/home/martin/x/packages/lisp/debug/")
+    ("gdbsrc.el"
+        "Source-based (as opposed to comint-based) debugger"
+        (c  unix  tools  debugging)
+        "/home/martin/x/packages/lisp/debug/")
+    ("gud.el"
+        "Grand Unified Debugger mode for gdb, sdb, dbx, or xdb"
+        (c  unix  tools  debugging)
+        "/home/martin/x/packages/lisp/debug/")
+    ("history.el"
+        "Generic history stuff"
+        nil
+        "/home/martin/x/packages/lisp/debug/")
+    ("advise-eval-region.el"
+        "Wrap advice around eval-region"
+        (extensions lisp)
+        "/home/martin/x/packages/lisp/edebug/")
+    ("cust-print.el"
+        "handles print-level and print-circle."
+        (extensions)
+        "/home/martin/x/packages/lisp/edebug/")
+    ("edebug-cl-read.el"
+        "Edebug reader macros for use with cl-read."
+        (lisp  tools  maint)
+        "/home/martin/x/packages/lisp/edebug/")
+    ("edebug.el"
+        "a source-level debugger for Emacs Lisp"
+        (lisp  tools  maint)
+        "/home/martin/x/packages/lisp/edebug/")
+    ("eval-reg.el"
+        "Redefine eval-region, and subrs that use it, in Lisp"
+        (lisp)
+        "/home/martin/x/packages/lisp/edebug/")
+    ("ediff-diff.el"
+        "diff-related utilities"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-help.el"
+        "Code related to the contents of Ediff help buffers"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-hook.el"
+        "setup for Ediff's menus and autoloads"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-init.el"
+        "Macros, variables, and defsubsts used by Ediff"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-merg.el"
+        "merging utilities"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-mult.el"
+        "support for multi-file/multi-buffer processing in Ediff"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-ptch.el"
+        "Ediff's  patch support"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-tbar.el"
+        "A toolbar for Ediff control buffer"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-util.el"
+        "the core commands and utilities of ediff"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-vers.el"
+        "version control interface to Ediff"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff-wind.el"
+        "window manipulation utilities"
+        nil
+        "/home/martin/x/packages/lisp/ediff/")
+    ("ediff.el"
+        "a comprehensive visual interface to diff & patch"
+        (comparing  merging  patching  version control.)
+        "/home/martin/x/packages/lisp/ediff/")
+    ("abbrevlist.el"
+        "list one abbrev table alphabetically ordered."
+        (abbrev)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("after-save-commands.el"
+        "Run a shell command after saving a file"
+        (processes unix)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("array.el"
+        "array editing commands for XEmacs"
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("atomic-extents.el"
+        "treat regions of text as a single object"
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("avoid.el"
+        "make mouse pointer stay out of the way of editing"
+        (mouse)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("backup-dir.el"
+        "allow backup files to live in some other directory(s)."
+        (backup file)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("big-menubar.el"
+        "an alternate menubar"
+        (mouse menubar)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("blink-cursor.el"
+        "Blink the cursor on or off"
+        (display)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("blink-paren.el"
+        "blink the matching paren, just like Zmacs"
+        (faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("bookmark.el"
+        "set bookmarks, maybe annotate them, jump to them later."
+        (bookmarks  placeholders  annotations)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("compare-w.el"
+        "compare text between windows for Emacs."
+        nil
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("completion.el"
+        "dynamic word-completion code"
+        (abbrev)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("dabbrev.el"
+        "dynamic abbreviation package"
+        (abbrev expand completion)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("desktop.el"
+        "save partial status of Emacs when killed"
+        (customization)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("detached-minibuf.el"
+        "Support a detached minibuffer for XEmacs."
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("edit-faces.el"
+        "interactive face editing mode"
+        (faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("edit-toolbar.el"
+        "Interactive toolbar editing mode for XEmacs"
+        (tools)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("fast-lock.el"
+        "Automagic text properties caching for fast Font Lock mode."
+        (faces files)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("file-part.el"
+        "treat a section of a buffer as a separate file"
+        (extensions  tools)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("floating-toolbar.el"
+        "popup toolbar support for XEmacs."
+        (lisp)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("flow-ctrl.el"
+        "help for lusers on cu(1) or ttys with wired-in ^S/^Q flow control"
+        (hardware)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("foldout.el"
+        "Folding extensions for outline-mode and outline-minor-mode."
+        (folding  outline)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("func-menu.el"
+        "Jump to a function within a buffer."
+        (tools  c  lisp)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("hippie-exp.el"
+        "expand text trying various ways to find its expansion."
+        (abbrev)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("id-select.el"
+        "Select larger and larger syntax-driven regions in a buffer"
+        (matching  mouse)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("info-look.el"
+        "major-mode-sensitive Info index lookup facility."
+        (help languages)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("iswitchb.el"
+        "switch between buffers using substrings"
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("lazy-lock.el"
+        "Lazy demand-driven fontification for fast Font Lock mode."
+        (faces files)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("lazy-shot.el"
+        "Lazy font locking for XEmacs"
+        (languages  faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("lispm-fonts.el"
+        "quick hack to parse LISPM-style font-shift codes"
+        (faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("live-icon.el"
+        "make frame icons represent the current frame contents"
+        nil
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("makesum.el"
+        "generate key binding summary for Emacs"
+        (help)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("man.el"
+        "browse UNIX manual pages"
+        (help)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("mic-paren.el"
+        "highlight matching parenthesises."
+        (languages  faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("outl-mouse.el"
+        "outline mode mouse commands for Emacs"
+        (outlines  mouse)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("page-ext.el"
+        "extended page handling commands"
+        nil
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("paren.el"
+        "highlight (un)matching parens and whole expressions"
+        (languages  faces)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("permanent-buffers.el"
+        "Permanent buffers management package."
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("popper.el"
+        "shrink-wrapped temporary windows for Emacs"
+        (temporary window  popup window)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("recent-files.el"
+        "Maintain menu of recently opened files."
+        (menu  file)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("redo.el"
+        "Redo/undo system for XEmacs"
+        (lisp  extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("resume.el"
+        "process command line args from within a suspended Emacs job"
+        (processes)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("rsz-minibuf.el"
+        "dynamically resize minibuffer to display entire contents"
+        (minibuffer  window  frames  display)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("savehist.el"
+        "Save minibuffer history"
+        (minibuffer)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("saveplace.el"
+        "automatically save place in files."
+        (bookmarks  placeholders)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("tempo.el"
+        "Flexible template insertion"
+        (extensions  languages  tools)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("toolbar-utils.el"
+        "Toolbar utility functions for XEmacs"
+        (extensions)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("uniquify.el"
+        "unique buffer names dependent on file name"
+        nil
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("where-was-i-db.el"
+        "Keep persistent state in visited files."
+        (tools  data  wp)
+        "/home/martin/x/packages/lisp/edit-utils/")
+    ("edt-lk201.el"
+        "Enhanced EDT Keypad Mode Emulation for LK-201 Keyboards"
+        (emulations)
+        "/home/martin/x/packages/lisp/edt/")
+    ("edt-mapper.el"
+        "Create an EDT LK-201 Map File for X-Windows Emacs"
+        (emulations)
+        "/home/martin/x/packages/lisp/edt/")
+    ("edt-pc.el"
+        "Enhanced EDT Keypad Mode Emulation for PC 101 Keyboards"
+        (emulations)
+        "/home/martin/x/packages/lisp/edt/")
+    ("edt-vt100.el"
+        "Enhanced EDT Keypad Mode Emulation for VT Series Terminals"
+        (emulations)
+        "/home/martin/x/packages/lisp/edt/")
+    ("edt.el"
+        "Enhanced EDT Keypad Mode Emulation for GNU Emacs 19"
+        (emulations)
+        "/home/martin/x/packages/lisp/edt/")
+    ("dll-debug.el"
+        "A slow implementation of dll for debugging."
+        (extensions  lisp)
+        "/home/martin/x/packages/lisp/elib/")
+    ("emerge.el"
+        "merge diffs under Emacs control"
+        (unix  tools)
+        "/home/martin/x/packages/lisp/emerge/")
+    ("term.el"
+        "general command interpreter in a window stuff"
+        nil
+        "/home/martin/x/packages/lisp/eterm/")
+    ("tshell.el"
+        "specialized term.el for running the shell."
+        (processes)
+        "/home/martin/x/packages/lisp/eterm/")
+    ("eudc-bbdb.el"
+        "Emacs Unified Directory Client - BBDB Backend"
+        (help)
+        "/home/martin/x/packages/lisp/eudc/")
+    ("eudc-custom-vars.el"
+        "Emacs Unified Directory Client"
+        (help)
+        "/home/martin/x/packages/lisp/eudc/")
+    ("eudc-ldap.el"
+        "Emacs Unified Directory Client - LDAP Backend"
+        (help)
+        "/home/martin/x/packages/lisp/eudc/")
+    ("eudc-ph.el"
+        "Emacs Unified Directory Client - CCSO PH/QI Backend"
+        (help)
+        "/home/martin/x/packages/lisp/eudc/")
+    ("eudc.el"
+        "Emacs Unified Directory Client"
+        (help)
+        "/home/martin/x/packages/lisp/eudc/")
+    ("footnote-cyrillic.el"
+        "Cyrillic lettering for footnote mode"
+        (mule  news  mail)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("footnote-greek.el"
+        "Greek lettering for footnote mode"
+        (mule  news  mail)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("footnote-han.el"
+        "Han Japanese footnote support"
+        (mail  news  mule)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("footnote-hebrew.el"
+        "Hebrew lettering for footnote mode"
+        (mule  news  mail)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("footnote-kana.el"
+        "more Japanese footnote support"
+        (mail  news  mule)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("footnote.el"
+        "Footnote support for message mode"
+        (mail  news)
+        "/home/martin/x/packages/lisp/footnote/")
+    ("forms-d2.el"
+        "demo forms-mode"
+        nil
+        "/home/martin/x/packages/lisp/forms/")
+    ("forms-pass.el"
+        "passwd file demo for forms-mode"
+        nil
+        "/home/martin/x/packages/lisp/forms/")
+    ("forms.el"
+        "Forms mode: edit a file as a form to fill in"
+        (extensions)
+        "/home/martin/x/packages/lisp/forms/")
+    ("frame-icon.el"
+        "set up mode-specific icons for each frame under XEmacs"
+        (frames  lisp  extensions)
+        "/home/martin/x/packages/lisp/frame-icon/")
+    ("overlay.el"
+        "overlay support."
+        (internal)
+        "/home/martin/x/packages/lisp/fsf-compat/")
+    ("thingatpt.el"
+        "Get the `thing' at point"
+        (extensions  matching  mouse)
+        "/home/martin/x/packages/lisp/fsf-compat/")
+    ("timer.el"
+        "run a function with args at some time in future."
+        nil
+        "/home/martin/x/packages/lisp/fsf-compat/")
+    ("x-popup-menu.el"
+        "Mimic x-popup-menu in FSF Emacs"
+        (frames)
+        "/home/martin/x/packages/lisp/fsf-compat/")
+    ("gamegrid.el"
+        "Library for implementing grid-based games on Emacs."
+        (games)
+        "/home/martin/x/packages/lisp/games/")
+    ("snake.el"
+        "Implementation of Snake for Emacs."
+        (games)
+        "/home/martin/x/packages/lisp/games/")
+    ("sokoban.el"
+        "Implementation of Sokoban for Emacs."
+        (games)
+        "/home/martin/x/packages/lisp/games/")
+    ("tetris.el"
+        "Implementation of Tetris for Emacs."
+        (games)
+        "/home/martin/x/packages/lisp/games/")
+    ("dgnushack.el"
+        "a hack to set the load path for byte-compiling"
+        (news  path)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("earcon.el"
+        "Sound effects for messages"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-agent.el"
+        "unplugged support for Gnus"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-art.el"
+        "article mode commands for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-async.el"
+        "asynchronous support for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-audio.el"
+        "Sound effects for Gnus"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-bcklg.el"
+        "backlog functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-cache.el"
+        "cache interface for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-cite.el"
+        "parse citations in articles for Gnus"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-cus.el"
+        "customization commands for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-demon.el"
+        "daemonic Gnus behaviour"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-draft.el"
+        "draft message support for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-dup.el"
+        "suppression of duplicate articles in Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-eform.el"
+        "a mode for editing forms for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-ems.el"
+        "functions for making Gnus work under different Emacsen"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-gl.el"
+        "an interface to GroupLens for Gnus"
+        (news  score)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-group.el"
+        "group mode commands for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-int.el"
+        "backend interface functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-kill.el"
+        "kill commands for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-load.el"
+        "automatically extracted custom dependencies"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-logic.el"
+        "advanced scoring code for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-mh.el"
+        "mh-e interface for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-move.el"
+        "commands for moving Gnus from one server to another"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-msg.el"
+        "mail and post interface for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-nocem.el"
+        "NoCeM pseudo-cancellation treatment"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-picon.el"
+        "displaying pretty icons in Gnus"
+        (news xpm annotation glyph faces)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-range.el"
+        "range and sequence functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-salt.el"
+        "alternate summary mode interfaces for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-score.el"
+        "scoring code for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-setup.el"
+        "Initialization & Setup for Gnus 5"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-soup.el"
+        "SOUP packet writing support for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-spec.el"
+        "format spec functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-srvr.el"
+        "virtual server support for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-start.el"
+        "startup functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-sum.el"
+        "summary mode commands for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-topic.el"
+        "a folding minor mode for Gnus group buffers"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-undo.el"
+        "minor mode for undoing in Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-util.el"
+        "utility functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-uu.el"
+        "extract (uu)encoded files in Gnus"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-vm.el"
+        "vm interface for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-win.el"
+        "window configuration functions for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus-xmas.el"
+        "Gnus functions for XEmacs"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("gnus.el"
+        "a newsreader for GNU Emacs"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("mailheader.el"
+        "Mail header parsing, merging, formatting"
+        (tools  mail  news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("md5.el"
+        "MD5 Message Digest Algorithm"
+        nil
+        "/home/martin/x/packages/lisp/gnus/")
+    ("message.el"
+        "composing mail and news messages"
+        (mail  news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("messagexmas.el"
+        "XEmacs extensions to message"
+        (mail  news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("messcompat.el"
+        "making message mode compatible with mail mode"
+        (mail  news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnagent.el"
+        "offline backend for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnbabyl.el"
+        "rmail mbox access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nndb.el"
+        "nndb access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nndir.el"
+        "single directory newsgroup access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nndoc.el"
+        "single file access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nndraft.el"
+        "draft article access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nneething.el"
+        "arbitrary file access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnfolder.el"
+        "mail folder access for Gnus"
+        (mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nngateway.el"
+        "posting news via mail gateways"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnheader.el"
+        "header access macros for Gnus and its backends"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnheaderxm.el"
+        "making Gnus backends work under XEmacs"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnkiboze.el"
+        "select virtual news access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnlistserv.el"
+        "retrieving articles via web mailing list archives"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnmail.el"
+        "mail support functions for the Gnus mail backends"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnmbox.el"
+        "mail mbox access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnmh.el"
+        "mhspool access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnml.el"
+        "mail spool access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnoo.el"
+        "OO Gnus Backends"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnsoup.el"
+        "SOUP access for Gnus"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnspool.el"
+        "spool access for GNU Emacs"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nntp.el"
+        "nntp access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnvirtual.el"
+        "virtual newsgroups access for Gnus"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("nnweb.el"
+        "retrieving articles via web search engines"
+        (news)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("parse-time.el"
+        "Parsing time strings"
+        (util)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("pop3.el"
+        "Post Office Protocol (RFC 1460) interface"
+        (mail  pop3)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("score-mode.el"
+        "mode for editing Gnus score files"
+        (news  mail)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("smiley.el"
+        "displaying smiley faces"
+        (fun)
+        "/home/martin/x/packages/lisp/gnus/")
+    ("hm--html-menu.el"
+        "A menu for the hm--html-mode."
+        nil
+        "/home/martin/x/packages/lisp/hm--html-menus/")
+    ("hm--html-mode.el"
+        "Major mode for editing HTML documents for the WWW"
+        (hypermedia languages help docs wp)
+        "/home/martin/x/packages/lisp/hm--html-menus/")
+    ("html-view.el"
+        "routines for communicating with a NCSA Mosaic process"
+        (comm unix wp help)
+        "/home/martin/x/packages/lisp/hm--html-menus/")
+    ("internal-drag-and-drop.el"
+        "Internal drag and drop interface"
+        (mouse)
+        "/home/martin/x/packages/lisp/hm--html-menus/")
+    ("tmpl-minor-mode.el"
+        "Template Minor Mode"
+        (data tools)
+        "/home/martin/x/packages/lisp/hm--html-menus/")
+    ("igrep.el"
+        "An improved interface to `grep` and `find`."
+        nil
+        "/home/martin/x/packages/lisp/igrep/")
+    ("jde-db.el"
+        "Debugger mode for jdb."
+        (java  tools)
+        "/home/martin/x/packages/lisp/jde/")
+    ("jde-gen.el"
+        "Integrated Development Environment for Java."
+        (java  tools)
+        "/home/martin/x/packages/lisp/jde/")
+    ("jde-make.el"
+        "Integrated Development Environment for Java."
+        (java  tools)
+        "/home/martin/x/packages/lisp/jde/")
+    ("jde-run.el"
+        "runs the Java app in the current buffer."
+        (tools  processes)
+        "/home/martin/x/packages/lisp/jde/")
+    ("jde.el"
+        "Integrated Development Environment for Java."
+        (java  tools)
+        "/home/martin/x/packages/lisp/jde/")
+    ("browse-url.el"
+        "ask a WWW browser to load a URL"
+        (hypertext)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("highlight-headers.el"
+        "highlighting message headers."
+        (mail  news)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("mail-abbrevs.el"
+        "Abbrev-expansion of mail aliases."
+        nil
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("mail-extr.el"
+        "extract full name and address from RFC 822 mail header."
+        (mail)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("mail-utils.el"
+        "utility functions used both by rmail and rnews"
+        (mail  news)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("reporter.el"
+        "customizable bug reporting of lisp programs"
+        (maint mail tools)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("rfc822.el"
+        "hairy rfc822 parser for mail and news and suchlike"
+        (mail)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("rmail-mini.el"
+        "minimal core of \"RMAIL\" mail reader for Emacs."
+        (mail)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("rmailout.el"
+        "\"RMAIL\" mail reader for Emacs: output message to a file."
+        (mail)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("sendmail.el"
+        "mail sending commands for Emacs."
+        (mail)
+        "/home/martin/x/packages/lisp/mail-lib/")
+    ("mc-remail.el"
+        "Remailer support for Mailcrypt"
+        nil
+        "/home/martin/x/packages/lisp/mailcrypt/")
+    ("mew-attach.el"
+        "attachments for Mew Draft mode"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-bq.el"
+        "Base64 and Quoted-Printable encoding for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-cache.el"
+        "Cache management for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-complete.el"
+        "Completion magic for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-decode.el"
+        "MIME syntax decoder for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-demo.el"
+        "Startup demo for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-draft.el"
+        "Draft mode for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-encode.el"
+        "MIME syntax encoder for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-env.el"
+        "Environment setup for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-ext.el"
+        "Message/External-Body support for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-fib.el"
+        "Filling blanks for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-func.el"
+        "Basic functions for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-header.el"
+        "Mail header stuff for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-highlight.el"
+        "Highlight for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-lang-jp.el"
+        "Japanese specific stuff for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-mark.el"
+        "Marking for Mew Summary and Virtual mode"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-message.el"
+        "Message mode for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-mime.el"
+        "MIME launcher for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-minibuf.el"
+        "Minibuffer input methods for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-mule0.el"
+        "Environment of non-Mule for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-mule2.el"
+        "Environment of Mule version 2 for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-mule3.el"
+        "Environment of Mule version 3 for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-pgp.el"
+        "PGP/MIME for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-pick.el"
+        "Picking up messages for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-refile.el"
+        "Refile for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-scan.el"
+        "Scanning messages for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-sort.el"
+        "Sorting messages for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-summary.el"
+        "Summary mode for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-syntax.el"
+        "Internal syntax for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-temacs.el"
+        "Environment of Text Emacs for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-unix.el"
+        "MIME content type for UNIX"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-vars.el"
+        "Variables and Constants for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-virtual.el"
+        "Virtual mode for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-win32.el"
+        "Settings for Mew on Win32"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew-xemacs.el"
+        "Environment of XEmacs for Mew"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mew.el"
+        "Messaging in the Emacs World"
+        nil
+        "/home/martin/x/packages/lisp/mew/")
+    ("mh-comp.el"
+        "mh-e functions for composing messages"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-e.el"
+        "GNU Emacs interface to the MH mail system"
+        (mail)
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-funcs.el"
+        "mh-e functions not everyone will use right away"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-mime.el"
+        "mh-e support for composing MIME messages"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-pick.el"
+        "make a search pattern and search for a message in mh-e"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-seq.el"
+        "mh-e sequences support"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("mh-utils.el"
+        "mh-e code needed for both sending and reading"
+        nil
+        "/home/martin/x/packages/lisp/mh-e/")
+    ("xmine.el"
+        "Mine game for XEmacs"
+        (games)
+        "/home/martin/x/packages/lisp/mine/")
+    ("NeXTify.el"
+        "Character insertion variation"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("advocacy.el"
+        "blatant XEmacs self promotion"
+        nil
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("blackbox.el"
+        "blackbox game in Emacs Lisp"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("conx.el"
+        "Yet another dissociater"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("decipher.el"
+        "Cryptanalyze monoalphabetic substitution ciphers"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("dissociate.el"
+        "scramble text amusingly for Emacs."
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("doctor.el"
+        "psychological help for frustrated users."
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("dunnet.el"
+        "Text adventure for Emacs"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("flame.el"
+        "Automated insults"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("gomoku.el"
+        "Gomoku game between you and Emacs"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("hanoi.el"
+        "towers of hanoi in GNUmacs"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("life.el"
+        "John Horton Conway's `Life' game for GNU Emacs"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("morse.el"
+        "Convert text to morse code and back."
+        nil
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("mpuz.el"
+        "multiplication puzzle for XEmacs"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("rot13.el"
+        "display a buffer in rot13."
+        nil
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("studly.el"
+        "StudlyCaps (tm)(r)(c)(xxx)"
+        (games)
+        "/home/martin/x/packages/lisp/misc-games/")
+    ("emacsbug.el"
+        "command to report Emacs bugs to appropriate mailing list."
+        (maint mail)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("feedmail.el"
+        "assist other email packages to massage outgoing messages "
+        (email  queue  mail  sendmail  message  spray  smtp  draft)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("metamail.el"
+        "Metamail interface for GNU Emacs"
+        (mail  news  mime  multimedia)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("net-utils.el"
+        "Network functions"
+        nil
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("rcompile.el"
+        "run a compilation on a remote machine"
+        (tools  processes)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("shadowfile.el"
+        "automatic file copying for Emacs 19"
+        (comm)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("webjump.el"
+        "programmable Web hotlist"
+        (comm www)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("webster-www.el"
+        "Look up a word in WWW Merriam-Webster dictionaries"
+        (comm  hypermedia)
+        "/home/martin/x/packages/lisp/net-utils/")
+    ("arc-mode.el"
+        "simple editing of archives"
+        (data  unix)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("background.el"
+        "fun with background jobs"
+        (processes)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("crypt.el"
+        "code for handling all sorts of compressed and encrypted files"
+        (extensions)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("ftelnet.el"
+        "remote login interface"
+        (unix  comm)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("inf-lisp.el"
+        "an inferior-lisp mode"
+        (processes  lisp)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("jka-compr.el"
+        "reading/writing/loading compressed files"
+        (data)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("kermit.el"
+        "additions to shell mode for use with kermit, etc."
+        (comm)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("ledit.el"
+        "Emacs side of ledit interface"
+        nil
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("lpr.el"
+        "print Emacs buffer on line printer."
+        (unix)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("mchat.el"
+        "Multicast Chatting package for XEmacs."
+        (comm processes)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("ps-print.el"
+        "Jim's Pretty-Good PostScript Generator for Emacs 19."
+        (print  postscript)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("rlogin.el"
+        "remote login interface"
+        (unix  comm)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("spell.el"
+        "spelling correction interface for Emacs."
+        (wp  unix)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("ssh.el"
+        "remote login interface"
+        (unix  comm)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("tar-mode.el"
+        "simple editing of tar files from GNU emacs"
+        (unix)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("telnet.el"
+        "run a telnet session from within an Emacs buffer"
+        (comm  unix)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("terminal.el"
+        "terminal emulator for GNU Emacs."
+        (comm  terminals)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("uncompress.el"
+        "auto-decompression hook for visiting .Z files"
+        (unix extensions)
+        "/home/martin/x/packages/lisp/os-utils/")
+    ("delbs.el"
+        "a small lisp package to allow you to swap around DEL/BS keys"
+        (lisp  terminals)
+        "/home/martin/x/packages/lisp/pc/")
+    ("fusion.el"
+        "CodeWright Fusion-style motion and text selection"
+        (keyboard selection region)
+        "/home/martin/x/packages/lisp/pc/")
+    ("pc-select.el"
+        "PC shift selection minor mode for XEmacs"
+        (hardware  mouse)
+        "/home/martin/x/packages/lisp/pc/")
+    ("pending-del.el"
+        "Making insertions replace any selected text."
+        nil
+        "/home/martin/x/packages/lisp/pc/")
+    ("s-region.el"
+        "set region using shift key."
+        (terminals)
+        "/home/martin/x/packages/lisp/pc/")
+    ("dired-cvs.el"
+        "Extensions to dired."
+        nil
+        "/home/martin/x/packages/lisp/pcl-cvs/")
+    ("generic-sc.el"
+        "generic interface to source control systems"
+        (tools  unix)
+        "/home/martin/x/packages/lisp/pcl-cvs/")
+    ("pcl-cvs.el"
+        "A Front-end to CVS.  Release R-2_0-Beta_2."
+        (cvs  version control  release management)
+        "/home/martin/x/packages/lisp/pcl-cvs/")
+    ("ph.el"
+        "Client for the CCSO directory system (aka PH/QI)"
+        (help)
+        "/home/martin/x/packages/lisp/ph/")
+    ("asm-mode.el"
+        "mode for editing assembler code"
+        (tools  languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("autoconf-mode.el"
+        "autoconf code editing commands for Emacs"
+        (languages  faces  m4  configure)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("awk-mode.el"
+        "AWK code editing commands for Emacs"
+        (unix  languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("cl-indent.el"
+        "enhanced lisp-indent mode"
+        (lisp  tools)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("cperl-mode.el"
+        "Perl code editing commands for XEmacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("cvs.el"
+        "Light cvs support for emacs (ediff + msb + dired + mode line)"
+        (cvs ediff mode-line)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("f90.el"
+        "Fortran-90 mode (free format)"
+        (fortran  f90  languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("fortran-misc.el"
+        "Routines than can be used with fortran mode."
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("fortran.el"
+        "Fortran mode for GNU Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("icon.el"
+        "mode for editing Icon code"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("ksh-mode.el"
+        "sh (ksh, bash) script editing mode for GNU Emacs."
+        (shell  korn  bourne  sh  ksh  bash)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("m4-mode.el"
+        "m4 code editing commands for Emacs"
+        (languages  faces)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("make-mode.el"
+        "makefile editing commands for Emacs"
+        (unix  tools)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("modula2.el"
+        "Modula-2 editing support package"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("pascal.el"
+        "major mode for editing pascal source in Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("perl-mode.el"
+        "Perl code editing commands for GNU Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("postscript.el"
+        "major mode for editing PostScript programs"
+        (langauges)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("prolog.el"
+        "major mode for editing and running Prolog under Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("python-mode.el"
+        "Major mode for editing Python programs"
+        (python languages oop)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("rexx-mode.el"
+        "major mode for editing REXX program files"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("simula.el"
+        "SIMULA 87 code editing commands for Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("sql.el"
+        "specialized comint.el for SQL interpreters"
+        (processes sql)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("tcl.el"
+        "Tcl code editing commands for Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("teco.el"
+        "Teco interpreter for Gnu Emacs, version 1."
+        (emulators)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("verilog-mode.el"
+        "major mode for editing verilog source in Emacs"
+        (languages)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("vrml-mode.el"
+        "major mode for editing VRML (.wrl) files"
+        (languages vrml modes)
+        "/home/martin/x/packages/lisp/prog-modes/")
+    ("iso-sgml.el"
+        "display SGML entity references as ISO 8859-1 characters"
+        (sgml  html  iso  latin  i18n)
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-api.el"
+        "Extra API functions for PSGML"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-dtd.el"
+        "DTD parser for SGML-editing mode with parsing support"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-edit.el"
+        "Editing commands for SGML-mode with parsing support"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-fs.el"
+        "Format a SGML-file according to a style file"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-html.el"
+        "HTML mode in conjunction with PSGML"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-other.el"
+        "Part of SGML-editing mode with parsing support"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-parse.el"
+        "Parser for SGML-editing mode with parsing support"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml-xemacs.el"
+        "Part of SGML-editing mode with parsing support"
+        nil
+        "/home/martin/x/packages/lisp/psgml/")
+    ("psgml.el"
+        "SGML-editing mode with parsing support"
+        (languages)
+        "/home/martin/x/packages/lisp/psgml/")
+    ("reftex.el"
+        "Minor mode for doing \\label, \\ref and \\cite in LaTeX"
+        (tex)
+        "/home/martin/x/packages/lisp/reftex/")
+    ("rmail-kill.el"
+        "Mail filtering for rmail"
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmail-xemacs.el"
+        "Mouse and font support for RMAIL running on XEmacs"
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmail.el"
+        "main code of \"RMAIL\" mail reader for Emacs."
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmailedit.el"
+        "\"RMAIL edit mode\"  Edit the current message."
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmailkwd.el"
+        "part of the \"RMAIL\" mail reader for Emacs."
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmailmsc.el"
+        "miscellaneous support functions for the RMAIL mail reader"
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmailsort.el"
+        "Rmail: sort messages."
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("rmailsum.el"
+        "make summary buffers for the mail reader"
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("undigest.el"
+        "digest-cracking support for the RMAIL mail reader"
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("unrmail.el"
+        "convert Rmail files to mailbox files."
+        (mail)
+        "/home/martin/x/packages/lisp/rmail/")
+    ("cmuscheme.el"
+        "Scheme process in a buffer. Adapted from tea.el."
+        (processes  lisp)
+        "/home/martin/x/packages/lisp/scheme/")
+    ("cmuscheme48.el"
+        "Scheme process in a buffer.  Adapted from cmuscheme.el."
+        nil
+        "/home/martin/x/packages/lisp/scheme/")
+    ("scheme.el"
+        "Scheme (and DSSSL) editing mode."
+        (languages  lisp)
+        "/home/martin/x/packages/lisp/scheme/")
+    ("xscheme.el"
+        "Run MIT-Scheme under XEmacs"
+        (languages  lisp)
+        "/home/martin/x/packages/lisp/scheme/")
+    ("linuxdoc-sgml.el"
+        "sgml-mode enhancements for linuxdoc"
+        (docs  languages)
+        "/home/martin/x/packages/lisp/sgml/")
+    ("sgml-mode.el"
+        "SGML- and HTML-editing modes"
+        (wp  hypermedia  comm  languages)
+        "/home/martin/x/packages/lisp/sgml/")
+    ("executable.el"
+        "base functionality for executable interpreter scripts"
+        (languages  unix)
+        "/home/martin/x/packages/lisp/sh-script/")
+    ("sh-script.el"
+        "shell-script editing commands for Emacs"
+        (languages  unix)
+        "/home/martin/x/packages/lisp/sh-script/")
+    ("color-selector.el"
+        "a graphical widget of three sliders to change faces. "
+        (extensions  faces)
+        "/home/martin/x/packages/lisp/slider/")
+    ("slider.el"
+        "graphical sliders for XEmacs. (c) 1997"
+        (utilities)
+        "/home/martin/x/packages/lisp/slider/")
+    ("sb-gud.el"
+        "Speedbar support for the Grand Unified Debugger"
+        (tools  gud)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("sb-info.el"
+        "Speedbar support for Info"
+        (file  tags  tools)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("sb-rmail.el"
+        "Speedbar support for rmail"
+        (file  tags  tools)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("sb-w3.el"
+        "Speedbar support for w3."
+        (file  tags  tools)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("speedbar.el"
+        "quick access to files and tags"
+        (file  tags  tools)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("speedbspec.el"
+        "Buffer specialized configurations for speedbar"
+        (file  tags  tools)
+        "/home/martin/x/packages/lisp/speedbar/")
+    ("strokes.el"
+        "Control XEmacs through mouse strokes --"
+        (lisp  mouse  extensions)
+        "/home/martin/x/packages/lisp/strokes/")
+    ("supercite.el"
+        "minor mode for citing mail and news replies"
+        (citation attribution mail news article reply followup)
+        "/home/martin/x/packages/lisp/supercite/")
+    ("detexinfo.el"
+        "remove Texinfo commands from a Texinfo source file"
+        (tex  docs)
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("informat.el"
+        "info support functions package for Emacs"
+        (help)
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("makeinfo.el"
+        "run makeinfo conveniently"
+        nil
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("tex-mode.el"
+        "TeX, LaTeX, and SliTeX mode commands."
+        nil
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("texinfmt.el"
+        "format Texinfo files into Info files."
+        nil
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("texinfo.el"
+        "major mode for editing Texinfo files"
+        (maint  tex  docs)
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("texnfo-upd.el"
+        "utilities for updating nodes and menus in Texinfo files"
+        (maint  tex  docs)
+        "/home/martin/x/packages/lisp/texinfo/")
+    ("autoinsert.el"
+        "automatic mode-dependent insertion of text into new files"
+        nil
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("flyspell.el"
+        "On-the-fly spell checker"
+        (convenience)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("folding.el"
+        "A folding-editor-like minor mode."
+        (tools)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("hexl.el"
+        "edit a file in a hex dump format using the hexl filter."
+        (data)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("image-mode.el"
+        "Major mode for navigate images"
+        (image  graphics)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("iso-acc.el"
+        "minor mode providing electric accent keys"
+        (i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("iso-ascii.el"
+        "set up char tables for ISO 8859/1 on ASCII terminals."
+        (i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("iso-cvt.el"
+        "translate to ISO 8859-1 from/to net/TeX conventions"
+        (tex  iso  latin  i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("iso-insert.el"
+        "insert functions for ISO 8859/1."
+        (i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("iso-swed.el"
+        "set up char tables for ISO 8859/1 for Swedish/Finnish ttys"
+        (i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("nroff-mode.el"
+        "GNU Emacs major mode for editing nroff source"
+        (wp)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("scribe.el"
+        "scribe mode, and its idiosyncratic commands."
+        (wp)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("swedish.el"
+        "miscellaneous functions for dealing with Swedish."
+        (i18n)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("tabify.el"
+        "tab conversion commands for XEmacs"
+        nil
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("underline.el"
+        "insert/remove underlining (done by overstriking) in Emacs."
+        (wp)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("whitespace-mode.el"
+        "minor mode for making whitespace visible"
+        (modes  extensions)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("winmgr-mode.el"
+        "generic window manager mode"
+        (languages)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("ws-mode.el"
+        "WordStar emulation mode for GNU Emacs"
+        (emulations)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("xpm-mode.el"
+        "minor mode for editing XPM files"
+        (data tools)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("xrdb-mode.el"
+        "mode for editing X resource database files"
+        (data languages)
+        "/home/martin/x/packages/lisp/text-modes/")
+    ("bib-mode.el"
+        "bib-mode, major mode for editing bib files."
+        (bib)
+        "/home/martin/x/packages/lisp/textools/")
+    ("bibtex.el"
+        "BibTeX mode for GNU Emacs"
+        (bibtex  latex  tex)
+        "/home/martin/x/packages/lisp/textools/")
+    ("doctex.el"
+        "grind GNU Emacs DOC file into LaTeX input"
+        (tex  docs)
+        "/home/martin/x/packages/lisp/textools/")
+    ("refbib.el"
+        "convert refer-style references to ones usable by Latex bib"
+        (bib  tex)
+        "/home/martin/x/packages/lisp/textools/")
+    ("time.el"
+        "display time and load in mode line of Emacs."
+        nil
+        "/home/martin/x/packages/lisp/time/")
+    ("char-util.el"
+        "character utility"
+        (character  emacs/mule)
+        "/home/martin/x/packages/lisp/tm/")
+    ("cless.el"
+        "Common lisp and Emacs Lisp source sharing"
+        (common lisp)
+        "/home/martin/x/packages/lisp/tm/")
+    ("gnus-art-mime.el"
+        "MIME extension for article mode of Gnus"
+        (news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("gnus-charset.el"
+        "MIME charset extension for Gnus"
+        (news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("gnus-mime.el"
+        "MIME extensions for Gnus"
+        (news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("gnus-sum-mime.el"
+        "MIME extension for summary mode of Gnus"
+        (news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("latex-math-symbol.el"
+        "LaTeX math symbol decoder"
+        (latex  math  mule)
+        "/home/martin/x/packages/lisp/tm/")
+    ("message-mime.el"
+        "MIME extensions for message.el"
+        (news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("mime-setup.el"
+        "setup file for tm viewer and composer."
+        (mail  news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("mu-bbdb.el"
+        "`attribution' function for mu-cite with BBDB."
+        nil
+        "/home/martin/x/packages/lisp/tm/")
+    ("mu-cite.el"
+        "yet another citation tool for GNU Emacs"
+        (mail  news  citation)
+        "/home/martin/x/packages/lisp/tm/")
+    ("range.el"
+        "range functions"
+        (range)
+        "/home/martin/x/packages/lisp/tm/")
+    ("signature.el"
+        "a signature utility for GNU Emacs"
+        (mail  news  signature)
+        "/home/martin/x/packages/lisp/tm/")
+    ("texi-util.el"
+        "Texinfo utility"
+        (texinfo)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tl-atype.el"
+        "atype functions"
+        (atype)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tl-list.el"
+        "utility functions about list"
+        (list)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tl-misc.el"
+        "miscellaneous utility of tl."
+        (load-path  module  structure)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tl-seq.el"
+        "sequence functions"
+        (sequence)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tl-str.el"
+        "Emacs Lisp Library module about string"
+        (string)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-bbdb.el"
+        "tm shared module for BBDB"
+        (mail  news  mime  multimedia  multilingual  bbdb)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-def.el"
+        "definition module for tm"
+        (mail  news  mime  multimedia  definition)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-edit-mc.el"
+        "Mailcrypt interface for tm-edit"
+        (mail  news  mime  multimedia  multilingual  security  pgp)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-edit.el"
+        "Simple MIME Composer for GNU Emacs"
+        (mail  news  mime  multimedia  multilingual)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-ew-d.el"
+        "RFC 2047 based encoded-word decoder for GNU Emacs"
+        (encoded-word  mime  multilingual  header  mail  news)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-ew-e.el"
+        "RFC 2047 based encoded-word encoder for GNU Emacs"
+        (encoded-word  mime  multilingual  header  mail  news)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-file.el"
+        "tm-view internal method for file extraction"
+        (mail  news  mime  multimedia  file  extract)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-ftp.el"
+        "tm-view internal method for anonymous ftp"
+        (anonymous ftp  mime  multimedia  mail  news)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-image.el"
+        "tm-view filter to display images in XEmacs or MULE buffers"
+        (image  picture  x-face  mime  multimedia  mail  news)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-mail.el"
+        "mail-mode extension."
+        (mail  mime  multimedia)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-mh-e.el"
+        "MIME extension for mh-e"
+        (mail  mh  mime  multimedia  encoded-word  multilingual)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-parse.el"
+        "MIME message parser"
+        (mail  news  mime  multimedia)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-partial.el"
+        "Grabbing all MIME \"message/partial\"s."
+        (mail  news  mime  multimedia  message/partial)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-pgp.el"
+        "tm-view internal methods for PGP."
+        (mail  news  mime  multimedia  pgp  security)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-play.el"
+        "decoder for tm-view.el"
+        (mail  news  mime  multimedia)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-rmail.el"
+        "MIME extension for RMAIL"
+        (mail  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-setup.el"
+        "setup file for tm viewer."
+        (mail  news  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-view.el"
+        "interactive MIME viewer for GNU Emacs"
+        (mail  news  mime  multimedia)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tm-vm.el"
+        "tm-MUA (MIME Extension module) for VM"
+        (mail  mime  multimedia  multilingual  encoded-word)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tmh-comp.el"
+        "tm-mh-e functions for composing messages"
+        (mail  mh  mime  multimedia  encoded-word  multilingual)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tu-comment.el"
+        "a comment out utility for Lisp programs."
+        (comment  lisp)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tu-replace.el"
+        "a replacing utility for GNU Emacs"
+        (replace)
+        "/home/martin/x/packages/lisp/tm/")
+    ("tpu-doc.el"
+        "Documentation for TPU-edt"
+        (emulations)
+        "/home/martin/x/packages/lisp/tpu/")
+    ("tpu-edt.el"
+        "Emacs emulating TPU emulating EDT"
+        (emulations)
+        "/home/martin/x/packages/lisp/tpu/")
+    ("tpu-extras.el"
+        "Scroll margins and free cursor mode for TPU-edt"
+        (emulations)
+        "/home/martin/x/packages/lisp/tpu/")
+    ("tpu-mapper.el"
+        "Create a TPU-edt X-windows keymap file"
+        (emulations)
+        "/home/martin/x/packages/lisp/tpu/")
+    ("vc-hooks.el"
+        "resident support for version-control"
+        nil
+        "/home/martin/x/packages/lisp/vc/")
+    ("vc.el"
+        "drive a version-control system from within Emacs"
+        nil
+        "/home/martin/x/packages/lisp/vc/")
+    ("vhdl-mode.el"
+        "major mode for editing VHDL code"
+        (languages vhdl)
+        "/home/martin/x/packages/lisp/vhdl/")
+    ("view-process-mode.el"
+        "Display current running processes"
+        (processes)
+        "/home/martin/x/packages/lisp/view-process/")
+    ("view-process-system-specific.el"
+        "System specific stuff for view-process"
+        (processes)
+        "/home/martin/x/packages/lisp/view-process/")
+    ("view-process-xemacs.el"
+        "XEmacs specific code for view-process"
+        (processes)
+        "/home/martin/x/packages/lisp/view-process/")
+    ("viper-cmd.el"
+        "Vi command support for Viper"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-ex.el"
+        "functions implementing the Ex commands for Viper"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-init.el"
+        "some common definitions for Viper"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-keym.el"
+        "Viper keymaps"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-macs.el"
+        "functions implementing keyboard macros for Viper"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-mous.el"
+        "mouse support for Viper"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper-util.el"
+        "Utilities used by viper.el"
+        nil
+        "/home/martin/x/packages/lisp/viper/")
+    ("viper.el"
+        "A full-featured Vi emulator for GNU Emacs and XEmacs,"
+        (emulations)
+        "/home/martin/x/packages/lisp/viper/")
+    ("vm-easymenu.el"
+        "support the easymenu interface for defining a menu."
+        (emulations)
+        "/home/martin/x/packages/lisp/vm/")
+    ("vm-loaddefs.el"
+        "autoloads for VM formerly in loaddefs.el"
+        (mail  dumped)
+        "/home/martin/x/packages/lisp/vm/")
+    ("base64.el"
+        "Base64 encoding functions"
+        (extensions)
+        "/home/martin/x/packages/lisp/w3/")
+    ("css.el"
+        "Cascading Style Sheet parser"
+        nil
+        "/home/martin/x/packages/lisp/w3/")
+    ("dsssl-flow.el"
+        "DSSSL flow objects"
+        nil
+        "/home/martin/x/packages/lisp/w3/")
+    ("dsssl.el"
+        "DSSSL parser"
+        nil
+        "/home/martin/x/packages/lisp/w3/")
+    ("images.el"
+        "Automatic image converters"
+        (images)
+        "/home/martin/x/packages/lisp/w3/")
+    ("mm.el"
+        "Mailcap parsing routines, and MIME handling"
+        (mail  news  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("mule-sysdp.el"
+        "consolidate MULE-version dependencies in one file."
+        (lisp  tools)
+        "/home/martin/x/packages/lisp/w3/")
+    ("socks.el"
+        "A Socks v5 Client for Emacs"
+        (comm  firewalls)
+        "/home/martin/x/packages/lisp/w3/")
+    ("ssl.el"
+        "ssl functions for emacsen without them builtin"
+        (comm)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-auth.el"
+        "Uniform Resource Locator authorization modules"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-cache.el"
+        "Uniform Resource Locator retrieval tool"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-cookie.el"
+        "Netscape Cookie support"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-file.el"
+        "File retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-gopher.el"
+        "Gopher Uniform Resource Locator retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-gw.el"
+        "Gateway munging for URL loading"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-http.el"
+        "HTTP Uniform Resource Locator retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-irc.el"
+        "IRC URL interface"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-mail.el"
+        "Mail Uniform Resource Locator retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-misc.el"
+        "Misc Uniform Resource Locator retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-news.el"
+        "News Uniform Resource Locator retrieval code"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-nfs.el"
+        "NFS URL interface"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-ns.el"
+        "Various netscape-ish functions for proxy definitions"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-parse.el"
+        "Uniform Resource Locator parser"
+        (comm  data  processes)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url-vars.el"
+        "Variables for Uniform Resource Locator tool"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("url.el"
+        "Uniform Resource Locator retrieval tool"
+        (comm  data  processes  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-about.el"
+        "About pages for emacs-w3"
+        (hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-cfg.el"
+        "Configuration info from Emacs/W3"
+        (hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-cus.el"
+        "Customization support for Emacs-W3"
+        (comm  help  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-display.el"
+        "display engine"
+        (faces  help  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-e19.el"
+        "Emacs 19.xx specific functions for emacs-w3"
+        (faces  help  mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-e20.el"
+        "Emacs 20.xx specific functions for emacs-w3"
+        (faces  help  mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-elisp.el"
+        "Scripting support for emacs-lisp"
+        (hypermedia  scripting)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-emulate.el"
+        "All variable definitions for emacs-w3"
+        (comm  help  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-forms.el"
+        "Emacs-w3 forms parsing code for new display engine"
+        (faces  help  comm  data  languages)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-hot.el"
+        "Main functions for emacs-w3 on all platforms/versions"
+        (faces  help  comm  news  mail  processes  mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-imap.el"
+        "Imagemap functions"
+        (hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-jscript.el"
+        "Scripting support for javascript"
+        (hypermedia  scripting)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-keyword.el"
+        "Emacs-W3 binding style sheet mechanism"
+        (hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-latex.el"
+        "Emacs-W3 printing via LaTeX"
+        (hypermedia  printing  typesetting)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-menu.el"
+        "Menu functions for emacs-w3"
+        (menu  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-mouse.el"
+        "Mouse specific functions for emacs-w3"
+        (mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-prefs.el"
+        "Preferences panels for Emacs-W3"
+        (hypermedia  preferences)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-print.el"
+        "Printing support for emacs-w3"
+        (faces  help  printing  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-props.el"
+        "Additional text property stuff"
+        (faces)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-script.el"
+        "Scripting support"
+        (hypermedia  scripting)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-speak.el"
+        "Emacs-W3 speech interface"
+        (hypermedia  speech)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-style.el"
+        "Emacs/W3 binding style sheet mechanism"
+        (faces  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-sysdp.el"
+        "consolidate Emacs-version dependencies in one file."
+        (lisp  tools)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-toolbar.el"
+        "Toolbar functions for emacs-w3"
+        (mouse  toolbar)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-vars.el"
+        "All variable definitions for emacs-w3"
+        (comm  help  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-widget.el"
+        "An image widget"
+        (faces  images)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3-xemac.el"
+        "XEmacs specific functions for emacs-w3"
+        (faces  help  mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("w3.el"
+        "Main functions for emacs-w3 on all platforms/versions"
+        (faces  help  comm  news  mail  processes  mouse  hypermedia)
+        "/home/martin/x/packages/lisp/w3/")
+    ("add-log.el"
+        "change log maintenance commands for Emacs"
+        (maint)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("advice.el"
+        "an overloading mechanism for Emacs Lisp functions"
+        (extensions  lisp  tools)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("annotations.el"
+        "interface to marginal annotations"
+        (extensions  hypermedia  outlines)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("assoc.el"
+        "insert/delete/sort functions on association lists"
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("case-table.el"
+        "code to extend the character set and support case tables."
+        (i18n)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("chistory.el"
+        "list command history"
+        nil
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("comint-xemacs.el"
+        "Face customizations for comint"
+        (help  faces)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("comint.el"
+        "general command interpreter in a window stuff"
+        (processes)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("compile.el"
+        "run compiler as inferior of Emacs, parse error messages."
+        (tools  processes)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("debug.el"
+        "debuggers and related commands for XEmacs"
+        nil
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("ebuff-menu.el"
+        "electric-buffer-list mode"
+        (frames)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("echistory.el"
+        "Electric Command History Mode"
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("edmacro.el"
+        "keyboard macro editor"
+        (abbrev  internal)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("ehelp.el"
+        "bindings for electric-help mode"
+        (help  extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("electric.el"
+        "window maker and Command loop for `electric' modes."
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("enriched.el"
+        "read and save files in text/enriched format"
+        (wp  faces)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("env.el"
+        "functions to manipulate environment variables."
+        (processes  unix)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("facemenu.el"
+        "create a face menu for interactively adding fonts to text"
+        (faces)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("ffap.el"
+        "find file (or url) at point"
+        (files  hypermedia  matching  mouse)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("helper.el"
+        "utility help package supporting help in electric modes"
+        (help)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("imenu.el"
+        "Framework for mode-specific buffer indexes."
+        (tools)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("iso-syntax.el"
+        "set up case-conversion and syntax tables for ISO 8859/1"
+        (i18n)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("macros.el"
+        "non-primitive commands for keyboard macros."
+        (abbrev)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("novice.el"
+        "handling of disabled commands (\"novice mode\") for XEmacs."
+        (internal  help)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("outline.el"
+        "outline mode commands for Emacs"
+        (outlines)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("passwd.el"
+        "Prompting for passwords semi-securely"
+        (comm  extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("pp.el"
+        "pretty printer for Emacs Lisp"
+        (lisp  tools  language  extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("regi.el"
+        "REGular expression Interpreting engine"
+        (extensions  matching)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("ring.el"
+        "handle rings of items"
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("shell.el"
+        "specialized comint.el for running the shell."
+        (processes shell terminal csh tcsh bash sh)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("skeleton.el"
+        "Lisp language extension for writing statement skeletons"
+        (extensions  abbrev  languages  tools)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("sort.el"
+        "commands to sort text in an XEmacs buffer."
+        (unix)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("thing.el"
+        "find language-specific contiguous pieces of text"
+        (extensions  languages)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("time-stamp.el"
+        "Maintain last change time stamps in files edited by Emacs"
+        (tools)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("timezone.el"
+        "time zone package for XEmacs"
+        (news)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("xbm-button.el"
+        "Create XBM text buttons under XEmacs"
+        (frames  internal)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("xpm-button.el"
+        "create XPM buttons"
+        (frames  internal)
+        "/home/martin/x/packages/lisp/xemacs-base/")
+    ("bench.el"
+        "benchmarking utility for emacsen"
+        (internal  maint)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("docref.el"
+        "Simple cross references for Elisp documentation strings"
+        (docs  help  lisp)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("eldoc.el"
+        "show function arglist or variable docstring in echo area"
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("elp.el"
+        "Emacs Lisp Profiler"
+        (debugging lisp tools)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("eval-expr.el"
+        "enhanced eval-expression command"
+        (extensions)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("find-func.el"
+        "find the definition of the Emacs Lisp function near point"
+        (emacs-lisp  functions  variables)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("find-gc.el"
+        "detect functions that call the garbage collector"
+        (maint)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("hide-copyleft.el"
+        "hide obnoxious copyright prologs"
+        nil
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("ielm.el"
+        "interaction mode for Emacs Lisp"
+        (lisp)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("pretty-print.el"
+        "Emacs Lisp pretty printer and macro expander"
+        (lisp  internal)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("profile.el"
+        "basic profiling commands for XEmacs"
+        (internal)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("regexp-opt.el"
+        "generate efficient regexps to match strings."
+        (strings  regexps)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("reposition.el"
+        "center a Lisp function or comment on the screen"
+        nil
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("trace.el"
+        "tracing facility for Emacs Lisp functions"
+        (tools  lisp)
+        "/home/martin/x/packages/lisp/xemacs-devel/")
+    ("zenirc-18.el"
+        "compatibility functions for Emacs 18"
+        (extensions  zenirc)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-8ball.el"
+        "magic 8 ball for ZenIRC"
+        (zenirc  extensions  magic  8ball)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-away.el"
+        "fancy away processing for ZenIRC"
+        (zenirc  extensions  oink)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-bork.el"
+        "Swedish Chef message catalog for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-color.el"
+        "color messages in zenirc"
+        (zenirc extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-complete.el"
+        "complete commands, nicknames, etc. in ZenIRC"
+        (zenirc  completion  extensions  oink)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-dcc.el"
+        "CTCP DCC module for ZenIRC"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-doto.el"
+        "do things to who, list, links replies"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-eval.el"
+        "join the \"mi emacs es tu emacs\" club"
+        (zenirc  extensions  eval  oink)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-fill.el"
+        "fill messages in zenirc"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-finnish.el"
+        "Finnish message catalog for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-format.el"
+        "format nick!user@host for zenirc"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-fortran.el"
+        "emulate F-BOT FORTRAN bot program with ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-french.el"
+        "French message catalog for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-history.el"
+        "keep a history of commands in ZenIRC"
+        (zenirc  history)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-ignore.el"
+        "ignore module for zenirc."
+        (zenirc  ignorance)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-iwantop.el"
+        "IWANTOP ctcp for granting channel operator bits"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-latin.el"
+        "Latin message catalog for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-make.el"
+        "a hack to set the load path for byte-compiling"
+        (zenirc  make)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-meditate.el"
+        "admonish others for disturbing your meditation"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-netsplit.el"
+        "hide excessive spew from netsplits"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-notify.el"
+        "Notifies you when people signon/off"
+        (zenirc  notify  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-oink.el"
+        "auto-oink"
+        (zenirc  extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-ojnk.el"
+        "Send ojnks - example of adding commands to zenirc"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-popup.el"
+        "pop up zenirc buffer window on signal"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-prime-p.el"
+        "flag prime numbers"
+        (zenirc  extensions  oink  "mmmm  primes")
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-signal.el"
+        "Fancy signal formatting for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-stamp.el"
+        "timestamping for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-swedish.el"
+        "Swedish message catalog for ZenIRC"
+        (extensions)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-yow-filter.el"
+        "neutralize yowage"
+        (zenirc  extensions  oink  yow)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc-yow.el"
+        "important pinheadery for ZenIRC"
+        (zenirc  extensions  oink  yow)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("zenirc.el"
+        "Waste time on Internet Relay Chat (ZenIRC client)"
+        (extensions  zenirc)
+        "/home/martin/x/packages/lisp/zenirc/")
+    ("dui-registry.el"
+        "Registry of dui dictionary methods"
+        (mule  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("dui.el"
+        "Dictionary user interface"
+        (mule  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("edict-edit.el"
+        "Edit an EDICT dictionary."
+        (mule  edict  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("edict-english.el"
+        "English morphology rules for edict.el"
+        (mule  edict  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("edict-japanese.el"
+        "Japanese morphology rules for edict.el"
+        (mule  edict  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("edict-morphology.el"
+        "morphology rewrite engine for edict.el"
+        (mule  edict  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("edict.el"
+        "Word lookup (with deinflection) in EDICT"
+        (mule  edict  dictionary)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("ts-mode.el"
+        "Insert time-stamps in buffers"
+        (minor mode)
+        "/home/martin/x/mule-packages/lisp/edict/")
+    ("egg-cwnn-leim.el"
+        "Egg/CWnn-related code for LEIM"
+        (japanese  input method  leim)
+        "/home/martin/x/mule-packages/lisp/egg-its/")
+    ("egg-kwnn-leim.el"
+        "Egg/CWnn-related code for LEIM"
+        (japanese  input method  leim)
+        "/home/martin/x/mule-packages/lisp/egg-its/")
+    ("egg-leim.el"
+        "Egg/Wnn-related code for LEIM"
+        (japanese  input method  leim)
+        "/home/martin/x/mule-packages/lisp/egg-its/")
+    ("egg-sj3-leim.el"
+        "Egg/SJ3-related code for LEIM"
+        (japanese  input method  leim)
+        "/home/martin/x/mule-packages/lisp/egg-its/")
+    ("egg-wnn.el"
+        "a inputting method communicating with [jck]server"
+        (inputting method)
+        "/home/martin/x/mule-packages/lisp/egg-its/")
+    ("cyril-jis.el"
+        "Quail package for inputting JISX0208 Cyrillic letters"
+        (multilingual  input method  cyrillic)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("cyrillic.el"
+        "Quail package for inputting Cyrillic characters"
+        (multilingual  input method  cyrillic)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("greek.el"
+        "Quail package for inputting Greek"
+        (multilingual  input method  greek)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("hangul.el"
+        "Quail package for inputting Korean Hangul characters"
+        (multilingual  input method  korean  hangul)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("hangul3.el"
+        "Quail package for inputting Korean Hangul characters"
+        (multilingual  input method  korean  hangul)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("hanja-jis.el"
+        "Quail package for inputting Korean Hanja (JISX0208)"
+        (multilingual  input method  korean  hangul)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("hanja.el"
+        "Quail-package for Korean Hanja (KSC5601)"
+        (multilingual  input method  korean  hanja)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("ipa.el"
+        "Quail package for inputting IPA characters"
+        (multilingual  input method  ipa)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("latin-pre.el"
+        "Quail packages for inputting various European characters."
+        (mule  multilingual  latin  input method)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("leim-list.el"
+        "list of LEIM (Library of Emacs Input Method)"
+        nil
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("py-punct.el"
+        "Quail packages for Chinese (pinyin + extra symbols)"
+        (multilingual  input method  chienese)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("pypunct-b5.el"
+        "Quail packages for Chinese (pinyin + extra symbols)"
+        (multilingual  input method  chienese)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("quail.el"
+        "Provides simple input method for multilingual text"
+        (mule  multilingual  input method)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("symbol-ksc.el"
+        "Quail-package for Korean Symbol (KSC5601)"
+        (multilingual  input method  korean  hangul)
+        "/home/martin/x/mule-packages/lisp/leim/")
+    ("arabic.el"
+        "pre-loaded support for Arabic."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("canna-leim.el"
+        "Canna-related code for LEIM"
+        (japanese  input method  leim)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("canna.el"
+        "Interface to the Canna input method."
+        (canna  japanese  input method  mule  multilingual)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("char-table.el"
+        "display table of charset"
+        (character  mule)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("chartblxmas.el"
+        "display table of charset by pop-up menu"
+        (character  xemacs/mule)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("china-util.el"
+        "utilities for Chinese"
+        (mule  multilingual  chinese)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("chinese.el"
+        "Support for Chinese"
+        (multilingual  chinese)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("cyril-util.el"
+        "utilities for Cyrillic scripts"
+        (mule  multilingual  cyrillic)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("english.el"
+        "English support"
+        (multibyte character  character set  syntax  category)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("european.el"
+        "Support for European languages"
+        (multilingual  european)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("hebrew.el"
+        "Support for Hebrew"
+        (multilingual  hebrew)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("isearch-mule.el"
+        "incremental search with front-end inputting method"
+        (search)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("japan-util.el"
+        "utilities for Japanese"
+        (mule  multilingual  japanese)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("japanese.el"
+        "Japanese support"
+        (multilingual  japanese)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("kinsoku.el"
+        "Kinsoku (line wrap) processing for XEmacs/Mule"
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("korean.el"
+        "Support for Korean"
+        (multilingual  korean)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("misc-lang.el"
+        "support for miscellaneous languages (characters)"
+        (multilingual  character set  coding system)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-category.el"
+        "category functions for XEmacs/Mule."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-ccl.el"
+        "CCL (Code Conversion Language) compiler"
+        (ccl  mule  multilingual  character set  coding-system)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-charset.el"
+        "Charset functions for Mule."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-cmds.el"
+        "Commands for multilingual environment"
+        (mule  multilingual)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-cne.el"
+        "interface between input methods Canna and EGG."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-coding.el"
+        "Coding-system functions for Mule."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-debug.el"
+        "debugging functions for Mule."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-diag.el"
+        "Show diagnosis of multilingual environment (MULE)"
+        (multilingual  charset  coding system  fontset  diagnosis)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-files.el"
+        "File I/O functions for XEmacs/Mule."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-help.el"
+        "Mule-ized Help functions "
+        (help  internal)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-keyboard.el"
+        "Direct input of multilingual chars from keyboard."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-misc.el"
+        "Miscellaneous Mule functions."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-tty-init.el"
+        "Initialization code for console tty under MULE"
+        (mule  tty  console  dumped)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-util.el"
+        "Utility functions for multilingual environment (mule)"
+        (mule  multilingual)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("mule-x-init.el"
+        "initialization code for X Windows under MULE"
+        (mule x11)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("thai-util.el"
+        "utilities for Thai"
+        (mule  multilingual  thai)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("thai.el"
+        "Support for Thai"
+        (multilingual  thai)
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("viet-chars.el"
+        "pre-loaded support for Vietnamese, part 1."
+        nil
+        "/home/martin/x/mule-packages/lisp/mule-base/")
+    ("skk-auto.el"
+        "\e$BAw$j2>L>$N<+F0=hM}$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-comp.el"
+        "\e$BJd40$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-foreword.el"
+        "\e$BA0=q$-\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-gadget.el"
+        "\e$B<B9TJQ49$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-kakasi.el"
+        "KAKASI \e$B4XO"%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-kcode.el"
+        "\e$B4A;z%3!<%I$r;H$C$?JQ49$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-leim.el"
+        "SKK related code for LEIM"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-menu.el"
+        "SKK Menul related functions."
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-num.el"
+        "\e$B?tCMJQ49$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-server.el"
+        "SKK \e$B%5!<%P!<$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-tree.el"
+        "\e$BLZ7A<0%G!<%?!<$r;H$C$?JQ49$N$?$a$N%W%m%0%i%`\e(B"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-vip.el"
+        "vip related functions for skk.el"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("skk-viper.el"
+        "SKK related code for Viper"
+        (japanese)
+        "/home/martin/x/mule-packages/lisp/skk/")
+    ("abbrev.el"
+        "abbrev mode commands for Emacs"
+        (abbrev  dumped)
+        "lisp/")
+    ("about.el"
+        "the About The Authors page (shameless self promotion)."
+        (extensions)
+        "lisp/")
+    ("alist.el"
+        "utility functions about assoc-list"
+        (alist)
+        "lisp/")
+    ("apropos.el"
+        "apropos commands for users and programmers."
+        (help)
+        "lisp/")
+    ("auto-save.el"
+        "Safer autosaving for EFS and tmp."
+        (extensions  dumped)
+        "lisp/")
+    ("auto-show.el"
+        "perform automatic horizontal scrolling as point moves"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("autoload.el"
+        "maintain autoloads in loaddefs.el."
+        (maint)
+        "lisp/")
+    ("backquote.el"
+        "Full backquote support for elisp.  Reverse compatible too."
+        (extensions  dumped)
+        "lisp/")
+    ("blessmail.el"
+        "Decide whether movemail needs special privileges."
+        (internal)
+        "lisp/")
+    ("buff-menu.el"
+        "buffer menu main function and support functions."
+        (extensions  dumped)
+        "lisp/")
+    ("buffer.el"
+        "buffer routines taken from C"
+        (internal  dumped)
+        "lisp/")
+    ("build-report.el"
+        "Automatically formatted build reports for XEmacs"
+        (internal)
+        "lisp/")
+    ("byte-optimize.el"
+        "the optimization passes of the emacs-lisp byte compiler."
+        (internal)
+        "lisp/")
+    ("bytecomp-runtime.el"
+        "byte-compiler support for inlining"
+        (internal  dumped)
+        "lisp/")
+    ("bytecomp.el"
+        "compilation of Lisp code into byte code."
+        (internal)
+        "lisp/")
+    ("callers-of-rpt.el"
+        "generate call graph of lisp in XEmacs"
+        (internal)
+        "lisp/")
+    ("check-features.el"
+        "Do a sanity check on an XEmacs build"
+        (internal)
+        "lisp/")
+    ("cl-compat.el"
+        "Common Lisp extensions for GNU Emacs Lisp (compatibility)"
+        (extensions)
+        "lisp/")
+    ("cl-extra.el"
+        "Common Lisp extensions for GNU Emacs Lisp (part two)"
+        (extensions  dumped)
+        "lisp/")
+    ("cl-macs.el"
+        "Common Lisp extensions for GNU Emacs Lisp (part four)"
+        (extensions)
+        "lisp/")
+    ("cl-seq.el"
+        "Common Lisp extensions for GNU Emacs Lisp (part three)"
+        (extensions  dumped)
+        "lisp/")
+    ("cl.el"
+        "Common Lisp extensions for GNU Emacs Lisp"
+        (extensions  dumped  lisp)
+        "lisp/")
+    ("cleantree.el"
+        "Remove out of date .elcs in lisp directories"
+        (internal)
+        "lisp/")
+    ("cmdloop.el"
+        "support functions for the top-level command loop."
+        (internal  dumped)
+        "lisp/")
+    ("code-files.el"
+        "File I/O functions for XEmacs."
+        nil
+        "lisp/")
+    ("code-process.el"
+        "Process coding functions for XEmacs."
+        (mule  multilingual  coding system  process)
+        "lisp/")
+    ("coding.el"
+        "Coding-system functions for XEmacs."
+        nil
+        "lisp/")
+    ("config.el"
+        "access configuration parameters"
+        (configure)
+        "lisp/")
+    ("console.el"
+        "miscellaneous console functions not written in C"
+        (internal  dumped)
+        "lisp/")
+    ("cus-dep.el"
+        "Find customization dependencies."
+        (internal)
+        "lisp/")
+    ("cus-edit.el"
+        "Tools for customizating Emacs and Lisp packages."
+        (help  faces)
+        "lisp/")
+    ("cus-face.el"
+        "Support for Custom faces."
+        (help  faces)
+        "lisp/")
+    ("cus-load.el"
+        "Batch load all available cus-load files"
+        (internal  help  faces)
+        "lisp/")
+    ("cus-start.el"
+        "define customization properties of builtins."
+        (internal  dumped)
+        "lisp/")
+    ("custom.el"
+        "Tools for declaring and initializing options."
+        (help  faces  dumped)
+        "lisp/")
+    ("derived.el"
+        "allow inheritance of major modes."
+        (extensions  dumped)
+        "lisp/")
+    ("device.el"
+        "miscellaneous device functions not written in C"
+        (internal  dumped)
+        "lisp/")
+    ("dialog.el"
+        "Dialog-box support for XEmacs"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("disass.el"
+        "disassembler for compiled Emacs Lisp code"
+        (internal)
+        "lisp/")
+    ("disp-table.el"
+        "functions for dealing with char tables."
+        (i18n  internal)
+        "lisp/")
+    ("dragdrop.el"
+        "window system-independent Drag'n'Drop support."
+        (drag  drop  dumped)
+        "lisp/")
+    ("dump-paths.el"
+        "set up XEmacs paths for dumping"
+        (internal  dumped)
+        "lisp/")
+    ("etags.el"
+        "etags facility for Emacs"
+        (tools)
+        "lisp/")
+    ("events.el"
+        "event functions for XEmacs."
+        (internal  event  dumped)
+        "lisp/")
+    ("extents.el"
+        "miscellaneous extent functions not written in C"
+        (internal  dumped)
+        "lisp/")
+    ("faces.el"
+        "Lisp interface to the C \"face\" structure"
+        (faces  internal  dumped)
+        "lisp/")
+    ("files-nomule.el"
+        "file I/O stubs when not under Mule."
+        (extensions  dumped)
+        "lisp/")
+    ("files.el"
+        "file input and output commands for XEmacs."
+        (extensions  dumped)
+        "lisp/")
+    ("fill.el"
+        "fill commands for XEmacs."
+        (wp  dumped)
+        "lisp/")
+    ("find-paths.el"
+        "setup various XEmacs paths"
+        (internal  dumped)
+        "lisp/")
+    ("finder.el"
+        "topic & keyword-based code finder"
+        (help)
+        "lisp/")
+    ("float-sup.el"
+        "detect absence of floating-point support in XEmacs runtime"
+        (internal  dumped)
+        "lisp/")
+    ("font-lock.el"
+        "decorating source files with fonts/colors based on syntax"
+        (languages  faces)
+        "lisp/")
+    ("font.el"
+        "New font model"
+        (faces)
+        "lisp/")
+    ("fontl-hooks.el"
+        "pre-loaded stuff for font-lock."
+        nil
+        "lisp/")
+    ("format.el"
+        "read and save files in multiple formats"
+        (extensions  dumped)
+        "lisp/")
+    ("frame.el"
+        "multi-frame management independent of window systems."
+        (internal  dumped)
+        "lisp/")
+    ("glyphs.el"
+        "Lisp interface to C glyphs"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("gnuserv.el"
+        "Lisp interface code between Emacs and gnuserv"
+        (environment  processes  terminals)
+        "lisp/")
+    ("gui.el"
+        "Basic GUI functions for XEmacs."
+        (internal  dumped)
+        "lisp/")
+    ("help-macro.el"
+        "Makes command line help such as help-for-help"
+        nil
+        "lisp/")
+    ("help-nomule.el"
+        "Help functions when not in Mule"
+        (help  internal  dumped)
+        "lisp/")
+    ("help.el"
+        "help commands for XEmacs."
+        (help  internal  dumped)
+        "lisp/")
+    ("hyper-apropos.el"
+        "Hypertext emacs lisp documentation interface."
+        (lisp  tools  help  docs  matching)
+        "lisp/")
+    ("indent.el"
+        "indentation commands for XEmacs"
+        (lisp  languages  tools  dumped)
+        "lisp/")
+    ("info.el"
+        "info package for Emacs."
+        (help)
+        "lisp/")
+    ("isearch-mode.el"
+        "Incremental search minor mode."
+        (extensions  dumped)
+        "lisp/")
+    ("iso8859-1.el"
+        "Set case and syntax tables for Latin 1"
+        (internal  dumped)
+        "lisp/")
+    ("itimer-autosave.el"
+        "Autosave functions with itimers"
+        (internal  dumped)
+        "lisp/")
+    ("keydefs.el"
+        "Define standard keybindings."
+        (internal  dumped)
+        "lisp/")
+    ("keymap.el"
+        "Keymap functions for XEmacs."
+        (internals  dumped)
+        "lisp/")
+    ("ldap.el"
+        "LDAP support for Emacs"
+        (help comm)
+        "lisp/")
+    ("lib-complete.el"
+        "Completion on the lisp search path"
+        (lisp  extensions  dumped)
+        "lisp/")
+    ("lisp-mnt.el"
+        "minor mode for Emacs Lisp maintainers"
+        (docs  maint)
+        "lisp/")
+    ("lisp-mode.el"
+        "Lisp mode, and its idiosyncratic commands."
+        (lisp  languages  dumped)
+        "lisp/")
+    ("lisp.el"
+        "Lisp editing commands for XEmacs"
+        (lisp  languages  dumped)
+        "lisp/")
+    ("list-mode.el"
+        "Major mode for buffers containing lists of items"
+        (extensions  dumped)
+        "lisp/")
+    ("loaddefs.el"
+        "define standard autoloads of other files"
+        (internal)
+        "lisp/")
+    ("loadhist.el"
+        "lisp functions for working with feature groups"
+        (internal  dumped)
+        "lisp/")
+    ("loadup.el"
+        "load up standardly loaded Lisp files for XEmacs."
+        (internal  dumped)
+        "lisp/")
+    ("make-docfile.el"
+        "Cache docstrings in external file"
+        (internal)
+        "lisp/")
+    ("map-ynp.el"
+        "General-purpose boolean question-asker."
+        (lisp  extensions  dumped)
+        "lisp/")
+    ("menubar-items.el"
+        "Menubar and popup-menu content for XEmacs."
+        (frames  extensions  internal  dumped)
+        "lisp/")
+    ("menubar.el"
+        "Menubar support for XEmacs"
+        (internal  extensions  dumped)
+        "lisp/")
+    ("minibuf.el"
+        "Minibuffer functions for XEmacs"
+        (internal  dumped)
+        "lisp/")
+    ("misc.el"
+        "miscellaneous functions for XEmacs"
+        (extensions  dumped)
+        "lisp/")
+    ("mode-motion.el"
+        "Mode-specific mouse-highlighting of text."
+        (internal  mouse  dumped)
+        "lisp/")
+    ("modeline.el"
+        "modeline hackery."
+        (extensions  dumped)
+        "lisp/")
+    ("mouse.el"
+        "window system-independent mouse support."
+        (mouse  dumped)
+        "lisp/")
+    ("msw-faces.el"
+        "mswindows-specific face stuff."
+        nil
+        "lisp/")
+    ("msw-glyphs.el"
+        "Support for glyphs in ms windows"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("msw-init.el"
+        "initialization code for mswindows"
+        nil
+        "lisp/")
+    ("msw-mouse.el"
+        "Mouse support for MS Windows."
+        (mouse  dumped)
+        "lisp/")
+    ("msw-select.el"
+        "Lisp interface to mswindows selections."
+        (extensions  dumped)
+        "lisp/")
+    ("multicast.el"
+        "lisp frontend for multicast connections in XEmacs"
+        (dumped comm processes)
+        "lisp/")
+    ("mwheel.el"
+        "Mouse support for MS intelli-mouse type mice"
+        (mouse)
+        "lisp/")
+    ("objects.el"
+        "Lisp interface to C window-system objects"
+        (faces  internal  dumped)
+        "lisp/")
+    ("obsolete.el"
+        "obsoleteness support"
+        (internal  dumped)
+        "lisp/")
+    ("package-admin.el"
+        "Installation and Maintenance of XEmacs packages"
+        (internal)
+        "lisp/")
+    ("package-get.el"
+        "Retrieve XEmacs package"
+        (internal)
+        "lisp/")
+    ("package-info.el"
+        "Generate information about an XEmacs package"
+        (internal)
+        "lisp/")
+    ("packages.el"
+        "Low level support for XEmacs packages"
+        (internal  lisp  dumped)
+        "lisp/")
+    ("page.el"
+        "page motion commands for emacs."
+        (extensions  dumped)
+        "lisp/")
+    ("paragraphs.el"
+        "paragraph and sentence parsing."
+        (wp  dumped)
+        "lisp/")
+    ("paths.el"
+        "define pathnames for use by various Emacs commands."
+        (internal  dumped)
+        "lisp/")
+    ("picture.el"
+        "\"Picture mode\" -- editing using quarter-plane screen model."
+        nil
+        "lisp/")
+    ("process.el"
+        "commands for subprocesses; split out of simple.el"
+        (internal  processes  dumped)
+        "lisp/")
+    ("rect.el"
+        "rectangle functions for XEmacs."
+        (internal)
+        "lisp/")
+    ("register.el"
+        "register commands for Emacs."
+        (internal  dumped)
+        "lisp/")
+    ("replace.el"
+        "search and replace commands for XEmacs."
+        (dumped  matching)
+        "lisp/")
+    ("scrollbar.el"
+        "Scrollbar support for XEmacs"
+        (internal  extensions  dumped)
+        "lisp/")
+    ("select.el"
+        "Lisp interface to windows selections."
+        (extensions  dumped)
+        "lisp/")
+    ("setup-paths.el"
+        "setup various XEmacs paths"
+        (internal  dumped)
+        "lisp/")
+    ("shadow.el"
+        "Locate Emacs Lisp file shadowings."
+        (lisp)
+        "lisp/")
+    ("simple.el"
+        "basic editing commands for XEmacs"
+        (lisp  extensions  internal  dumped)
+        "lisp/")
+    ("site-load.el"
+        "Template file for site-wide XEmacs customization"
+        (internal)
+        "lisp/")
+    ("sound.el"
+        "Loading sound files in XEmacs"
+        (internal)
+        "lisp/")
+    ("specifier.el"
+        "Lisp interface to specifiers"
+        (internal  dumped)
+        "lisp/")
+    ("startup.el"
+        "process XEmacs shell arguments"
+        (internal  dumped)
+        "lisp/")
+    ("subr.el"
+        "basic lisp subroutines for XEmacs"
+        (extensions  dumped)
+        "lisp/")
+    ("symbol-syntax.el"
+        "find chars with symbol syntax"
+        (matching)
+        "lisp/")
+    ("symbols.el"
+        "functions for working with symbols and symbol values"
+        (internal)
+        "lisp/")
+    ("syntax.el"
+        "Syntax-table hacking stuff, moved from syntax.c"
+        nil
+        "lisp/")
+    ("text-mode.el"
+        "text mode, and its idiosyncratic commands."
+        (wp  dumped)
+        "lisp/")
+    ("text-props.el"
+        "implements properties of characters"
+        (extensions  wp  faces  dumped)
+        "lisp/")
+    ("toolbar-items.el"
+        "Static initialization of XEmacs toolbar"
+        (frames  dumped)
+        "lisp/")
+    ("toolbar.el"
+        "Toolbar support for XEmacs"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("tty-init.el"
+        "initialization code for tty's"
+        (terminals  dumped)
+        "lisp/")
+    ("undo-stack.el"
+        "An \"undoable stack\" object."
+        (extensions  dumped)
+        "lisp/")
+    ("update-elc.el"
+        "Bytecompile out-of-date dumped files"
+        (internal)
+        "lisp/")
+    ("userlock.el"
+        "handle file access contention between multiple users"
+        (internal)
+        "lisp/")
+    ("version.el"
+        "Record version number of Emacs."
+        (internal  dumped)
+        "lisp/")
+    ("very-early-lisp.el"
+        "Lisp support always needed by temacs"
+        (internal  dumped)
+        "lisp/")
+    ("view-less.el"
+        "Minor mode for browsing files with keybindings like `less'"
+        (wp  unix)
+        "lisp/")
+    ("wid-browse.el"
+        "Functions for browsing widgets."
+        (extensions)
+        "lisp/")
+    ("wid-edit.el"
+        "Functions for creating and using widgets."
+        (extensions)
+        "lisp/")
+    ("widget.el"
+        "a library of user interface components."
+        (help  extensions  faces  hypermedia  dumped)
+        "lisp/")
+    ("window-xemacs.el"
+        "XEmacs window commands aside from those written in C."
+        (frames  extensions  dumped)
+        "lisp/")
+    ("window.el"
+        "XEmacs window commands aside from those written in C."
+        (frames  extensions  dumped)
+        "lisp/")
+    ("winnt.el"
+        "Lisp routines for Windows NT."
+        (mouse  dumped)
+        "lisp/")
+    ("x-compose.el"
+        "Compose-key processing in XEmacs"
+        (i18n)
+        "lisp/")
+    ("x-faces.el"
+        "X-specific face frobnication, aka black magic."
+        (extensions  internal  dumped)
+        "lisp/")
+    ("x-font-menu.el"
+        "Managing menus of X fonts."
+        nil
+        "lisp/")
+    ("x-init.el"
+        "initialization code for X windows"
+        (terminals  dumped)
+        "lisp/")
+    ("x-iso8859-1.el"
+        "Mapping between X keysym names and ISO 8859-1"
+        (extensions  internal  dumped)
+        "lisp/")
+    ("x-misc.el"
+        "miscellaneous X functions."
+        (extensions  dumped)
+        "lisp/")
+    ("x-mouse.el"
+        "Mouse support for X window system."
+        (mouse  dumped)
+        "lisp/")
+    ("x-scrollbar.el"
+        "scrollbar resourcing and such."
+        (extensions  dumped)
+        "lisp/")
+    ("x-select.el"
+        "Lisp interface to X Selections."
+        (extensions  dumped)
+        "lisp/")
+    ("x-win-sun.el"
+        "runtime initialization for Sun X servers and keyboards"
+        (terminals)
+        "lisp/")
+    ("x-win-xfree86.el"
+        "runtime initialization for XFree86 servers"
+        (terminals)
+        "lisp/")
+    ("AT386.el"
+        "terminal support package for IBM AT keyboards"
+        (terminals)
+        "lisp/term/")
+    ("apollo.el"
+        "Apollo Graphics Primitive Support Functions"
+        (hardware)
+        "lisp/term/")
+    ("bg-mouse.el"
+        "GNU Emacs code for BBN Bitgraph mouse."
+        (hardware)
+        "lisp/term/")
+    ("internal.el"
+        "setup support for PC keyboards and screens, internal terminal"
+        nil
+        "lisp/term/")
+    ("keyswap.el"
+        "swap BS and DEL keys"
+        (terminals)
+        "lisp/term/")
+    ("linux.el"
+        "define function key sequences for the Linux console"
+        (terminals)
+        "lisp/term/")
+    ("lk201.el"
+        "basic editing commands for XEmacs"
+        nil
+        "lisp/term/")
+    ("news.el"
+        "keypad and function key bindings for the Sony NEWS keyboard"
+        (terminals)
+        "lisp/term/")
+    ("pc-win.el"
+        "setup support for `PC windows' (whatever that is)."
+        nil
+        "lisp/term/")
+    ("scoansi.el"
+        "set up key names for SCO ansi console"
+        nil
+        "lisp/term/")
+    ("sun-mouse.el"
+        "mouse handling for Sun windows"
+        (hardware)
+        "lisp/term/")
+    ("sun.el"
+        "keybinding for standard default sunterm keys"
+        (terminals)
+        "lisp/term/")
+    ("sup-mouse.el"
+        "supdup mouse support for lisp machines"
+        (hardware)
+        "lisp/term/")
+    ("tvi970.el"
+        "terminal support for the Televideo 970"
+        (terminals)
+        "lisp/term/")
+    ("vt-control.el"
+        "Common VTxxx control functions"
+        (terminals)
+        "lisp/term/")
+    ("vt100-led.el"
+        "functions for LED control on VT-100 terminals & clones."
+        (hardware)
+        "lisp/term/")
+    ("vt100.el"
+        "define VT100 function key sequences in function-key-map"
+        (terminals)
+        "lisp/term/")
+    ("win32-win.el"
+        "parse switches controlling interface with win32"
+        (terminals)
+        "lisp/term/")
+    ("wyse50.el"
+        "terminal support code for Wyse 50"
+        (terminals)
+        "lisp/term/")
+    ("xterm.el"
+        "define function key sequences for xterm"
+        (terminals)
+        "lisp/term/")
+))
+
+(provide 'finder-inf)
+
+;;; finder-inf.el ends here
diff --git a/lisp/mule/mule-files.el b/lisp/mule/mule-files.el
new file mode 100644 (file)
index 0000000..e228426
--- /dev/null
@@ -0,0 +1,35 @@
+;;; mule-files.el --- File I/O functions for XEmacs/Mule.
+
+;; Copyright (C) 1992,93,94,95 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Amdahl Corporation.
+;; Copyright (C) 1995 Sun Microsystems.
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the 
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Derived from mule.el in the original Mule but heavily modified
+;;; by Ben Wing. Mostly moved to code-files.el
+
+;; 1997/3/11 modified by MORIOKA Tomohiko to sync with Emacs 20 API.
+
+;;; Code:
+
+(setq-default buffer-file-coding-system 'iso-2022-8)
+
+;;; mule-files.el ends here
diff --git a/lisp/package-get-base.el b/lisp/package-get-base.el
new file mode 100644 (file)
index 0000000..7eeebbd
--- /dev/null
@@ -0,0 +1,1466 @@
+(setq package-get-base
+'((eudc
+  (standards-version 1.0
+   version "1.09"
+   author-version "1.09"
+   date "1998-06-30"
+   build-date "1998-06-30"
+   maintainer "Oscar Figueiredo <Oscar.Figueiredo@epfl.ch>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "Emacs Unified Directory Client (LDAP, PH)."
+   filename "eudc-1.09-pkg.tar.gz"
+   md5sum "517bfd3112700fd3dcfc59e02bbb0b12"
+   size 40867
+   provides (eudc eudc-ldap eudc-ph)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+(footnote
+  (standards-version 1.0
+   version "1.03"
+   author-version "0.18x"
+   date "1998-06-01"
+   build-date "1998-06-01"
+   maintainer "SL Baur <steve@xemacs.org>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "Footnoting in mail message editing modes."
+   filename "footnote-1.03-pkg.tar.gz"
+   md5sum "bea3aa23b37988f690fa56ba8cc11e92"
+   size 18199
+   provides (footnote)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(gnats
+  (standards-version 1.0
+   version "1.03"
+   author-version "3.101"
+   date "1998-04-06"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "comm"
+   dump nil
+   description "XEmacs bug reports."
+   filename "gnats-1.03-pkg.tar.gz"
+   md5sum "2b8f3a25baa78ffd23927ac5bb5777b5"
+   size 126412
+   provides (gnats gnats-admin send-pr)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(gnus
+  (standards-version 1.0
+   version "1.21"
+   author-version "5.6.23"
+   date "1998-07-06"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "comm"
+   dump nil
+   description "The Gnus Newsreader and Mailreader."
+   filename "gnus-1.21-pkg.tar.gz"
+   md5sum "6d58f34293ec00bbd297a6abb98fe2e9"
+   size 1693384
+   provides (gnus message)
+   requires (gnus w3 mh-e mailcrypt rmail mail-lib xemacs-base)
+   type regular
+))
+(mailcrypt
+  (standards-version 1.0
+   version "1.04"
+   author-version "3.4"
+   date "1998-01-24"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "Support for messaging encryption with PGP."
+   filename "mailcrypt-1.04-pkg.tar.gz"
+   md5sum "66601a110f1499d3c6f815f806e43a71"
+   size 66937
+   provides (mailcrypt)
+   requires (gnus vm mail-lib xemacs-base)
+   type regular
+))
+(mew
+  (standards-version 1.0
+   version "1.0"
+   author-version "1.93b38"
+   date "1998-06-21"
+   build-date "1998-06-21"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "comm"
+   dump nil
+   description "Messaging in an Emacs World."
+   filename "mew-1.0-pkg.tar.gz"
+   md5sum "be366b8dd9495ecb7b3b6a7a46563faa"
+   size 441775
+   provides (mew)
+   requires (mew)
+   type regular
+))
+(mh-e
+  (standards-version 1.0
+   version "1.05"
+   author-version "21.0"
+   date "1998-01-24"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "comm"
+   dump nil
+   description "Front end support for MH."
+   filename "mh-e-1.05-pkg.tar.gz"
+   md5sum "62b8598c55698c74ddfe71e874f0fe5e"
+   size 129257
+   provides (mh-e)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(net-utils
+  (standards-version 1.0
+   version "1.08"
+   author-version "21.0"
+   date "1998-07-01"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "Miscellaneous Networking Utilities."
+   filename "net-utils-1.08-pkg.tar.gz"
+   md5sum "2591eca88f5ea04272012e479ea8665c"
+   size 107983
+   provides (ilisp-browse-cltl2 emacsbug feedmail metamail net-utils rcompile shadowfile webjump webster-www)
+   requires (w3 efs mail-lib xemacs-base)
+   type single
+))
+(rmail
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0"
+   date "1998-06-28"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "comm"
+   dump nil
+   description "An obsolete Emacs mailer."
+   filename "rmail-1.04-pkg.tar.gz"
+   md5sum "5a4fc73565cb0e9ea62d6b0665ccb013"
+   size 85711
+   provides (rmail rmailsum)
+   requires (tm apel mail-lib xemacs-base)
+   type regular
+))
+(supercite
+  (standards-version 1.0
+   version "1.07"
+   author-version "3.55x"
+   date "1998-05-07"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "An Emacs citation tool for News & Mail messages."
+   filename "supercite-1.07-pkg.tar.gz"
+   md5sum "c1ef998b1819e6b19efd10bf0e48534c"
+   size 71084
+   provides (supercite)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(tm
+  (standards-version 1.0
+   version "1.09"
+   author-version "21.0"
+   date "1998-06-09"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "comm"
+   dump nil
+   description "Emacs MIME support."
+   filename "tm-1.09-pkg.tar.gz"
+   md5sum "a5697117fc719a9c5a74a62f6b812101"
+   size 253269
+   provides (tm tm-edit tm-view mime-setup)
+   requires (gnus mh-e rmail vm mailcrypt mail-lib apel xemacs-base)
+   type regular
+))
+(vm
+  (standards-version 1.0
+   version "1.09"
+   author-version "6.53"
+   date "1998-06-26"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "comm"
+   dump t
+   description "An Emacs mailer."
+   filename "vm-1.09-pkg.tar.gz"
+   md5sum "a3dd4a14155abf835275120c62ca82fd"
+   size 514307
+   provides (vm)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(w3
+  (standards-version 1.0
+   version "1.06"
+   author-version "4.0pre18"
+   date "1998-05-01"
+   build-date "1998-05-02"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution experimental
+   priority high
+   category "comm"
+   dump nil
+   description "A Web browser."
+   filename "w3-1.06-pkg.tar.gz"
+   md5sum "fea5098f9e8dd5b3b82e3ebe7d447b9c"
+   size 581731
+   provides (w3 url)
+   requires (w3 mail-lib xemacs-base)
+   type regular
+))
+(cookie
+  (standards-version 1.0
+   version "1.07"
+   author-version "21.0b36"
+   date "1998-04-07"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "games"
+   dump nil
+   description "Spook and Yow (Zippy quotes)."
+   filename "cookie-1.07-pkg.tar.gz"
+   md5sum "df97f80082395667a0e23eda8f68b8dd"
+   size 34184
+   provides (cookie1 yow)
+   requires (xemacs-base)
+   type regular
+))
+(games
+  (standards-version 1.0
+   version "1.05"
+   author-version "1.04"
+   date "1998-06-04"
+   build-date "1998-07-09"
+   maintainer "Glynn Clements <glynn@sensei.co.uk>"
+   distribution stable
+   priority low
+   category "games"
+   dump nil
+   description "Tetris, Sokoban, and Snake."
+   filename "games-1.05-pkg.tar.gz"
+   md5sum "2b856bc25a05ad32400bdd947fec6231"
+   size 32000
+   provides (gamegrid snake tetris sokoban)
+   requires (xemacs-base)
+   type regular
+))
+(mine
+  (standards-version 1.0
+   version "1.05"
+   author-version "1.8x1"
+   date "1998-03-31"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "games"
+   dump nil
+   description "Minehunt Game."
+   filename "mine-1.05-pkg.tar.gz"
+   md5sum "330cd395304f600487b748d466993e06"
+   size 67568
+   provides (xmine)
+   requires (xemacs-base)
+   type regular
+))
+(misc-games
+  (standards-version 1.0
+   version "1.06"
+   author-version "21.0b35"
+   date "1998-03-22"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "games"
+   dump nil
+   description "Other amusements and diversions."
+   filename "misc-games-1.06-pkg.tar.gz"
+   md5sum "48d883e7e6092c227b476386ece41672"
+   size 165586
+   provides (decipher gomoku hanoi life morse rot13)
+   requires (xemacs-base)
+   type single
+))
+(Sun
+  (standards-version 1.0
+   version "1.05"
+   author-version "21.0b35"
+   date "1998-03-06"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution sun
+   priority low
+   category "libs"
+   dump t
+   description "Support for Sparcworks."
+   filename "Sun-1.05-pkg.tar.gz"
+   md5sum "70a776046ea5b12d08ca7276484f6139"
+   size 63826
+   provides (sccs eos-browser eos-common eos-debugger eos-debugger eos-editor eos-init eos-load eos-menubar eos-toolbar sunpro)
+   requires (cc-mode xemacs-base)
+   type regular
+))
+(apel
+  (standards-version 1.0
+   version "1.04"
+   author-version "3.3"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "libs"
+   dump nil
+   description "A Portable Emacs Library.  Used by XEmacs MIME support."
+   filename "apel-1.04-pkg.tar.gz"
+   md5sum "7082f6eaa80bfef9e655e1c603ff68d3"
+   size 34597
+   provides (atype emu-20 emu-e19 emu-x20 emu-xemacs emu file-detect filename install mule-caesar path-util richtext std11-parse std11 tinyrich)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+(dired
+  (standards-version 1.0
+   version "1.01"
+   author-version "7.9"
+   date "1998-05-05"
+   build-date "1998-05-05"
+   maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+   distribution stable
+   priority medium
+   category "libs"
+   dump nil
+   description "Manage file systems."
+   filename "dired-1.01-pkg.tar.gz"
+   md5sum "d9748d8e8af8a63095aaaab9924987ef"
+   size 187526
+   provides (diff dired)
+   requires (xemacs-base)
+   type regular
+))
+(edebug
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0b35"
+   date "1998-03-12"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "libs"
+   dump nil
+   description "An Emacs Lisp debugger."
+   filename "edebug-1.04-pkg.tar.gz"
+   md5sum "d4a46e9bee361d60cb079731e5b152e9"
+   size 118141
+   provides (edebug cl-read cust-print eval-reg cl-specs)
+   requires (xemacs-base)
+   type regular
+))
+(efs
+  (standards-version 1.0
+   version "1.08"
+   author-version "1.16x1"
+   date "1998-03-21"
+   build-date "1998-04-04"
+   maintainer "Mike Sperber <sperber@informatik.uni-tuebingen.de>"
+   distribution stable
+   priority medium
+   category "libs"
+   dump nil
+   description "Treat files on remote systems the same as local files."
+   filename "efs-1.08-pkg.tar.gz"
+   md5sum "1ec45851fe72d06d32a6f941877ae544"
+   size 347544
+   provides (efs)
+   requires (xemacs-base vm dired)
+   type regular
+))
+(fsf-compat
+  (standards-version 1.0
+   version "1.0"
+   author-version "21.0b39"
+   date "1998-03-25"
+   build-date "1998-05-06"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "libs"
+   dump nil
+   description "FSF Emacs compatibility files."
+   filename "fsf-compat-1.0-pkg.tar.gz"
+   md5sum "71351ff26a69b341015612d9b88dfc55"
+   size 16083
+   provides (overlay thingatpt timer)
+   requires ()
+   type single
+))
+(mail-lib
+  (standards-version 1.0
+   version "1.16"
+   author-version "21.0"
+   date "1998-06-08"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "libs"
+   dump nil
+   description "Fundamental lisp files for providing email support."
+   filename "mail-lib-1.16-pkg.tar.gz"
+   md5sum "8466339df937c3e7dc4176df85987cf3"
+   size 120230
+   provides (browse-url highlight-headers mail-abbrevs mail-extr mail-utils reporter rfc822 rmail-mini rmailout sendmail smtpmail)
+   requires (xemacs-base)
+   type regular
+))
+(sounds-au
+  (standards-version 1.0
+   version "1.02"
+   author-version "21.0"
+   date "1998-06-30"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "libs"
+   dump nil
+   description "XEmacs Sun sound files."
+   filename "sounds-au-1.02-pkg.tar.gz"
+   md5sum "061ab67267c7cdfe37472141130d19ff"
+   size 125736
+   provides ()
+   requires ()
+   type regular
+))
+(sounds-wav
+  (standards-version 1.0
+   version "1.02"
+   author-version "21.0"
+   date "1998-06-30"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "libs"
+   dump nil
+   description "XEmacs Microsoft sound files."
+   filename "sounds-wav-1.02-pkg.tar.gz"
+   md5sum "c970808088c408bfd780dc8466a848b3"
+   size 148621
+   provides ()
+   requires ()
+   type regular
+))
+(tooltalk
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0b35"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "libs"
+   dump t
+   description "Support for building with Tooltalk."
+   filename "tooltalk-1.04-pkg.tar.gz"
+   md5sum "60ea390c4aa203ea26d66ddb2f3ad99f"
+   size 9245
+   provides ()
+   requires ()
+   type regular
+))
+(xemacs-base
+  (standards-version 1.0
+   version "1.21"
+   author-version "21.0"
+   date "1998-07-02"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "libs"
+   dump nil
+   description "Fundamental XEmacs support, you almost certainly need this."
+   filename "xemacs-base-1.21-pkg.tar.gz"
+   md5sum "1807f3591bc644c52d41bf472cd30bfc"
+   size 458268
+   provides (add-log advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline overlay passwd pp regi ring shell skeleton sort thing time-stamp timezone xbm-button xpm-button)
+   requires ()
+   type regular
+))
+(xemacs-devel
+  (standards-version 1.0
+   version "1.13"
+   author-version "21.0"
+   date "1998-06-15"
+   build-date "1998-06-19"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "libs"
+   dump nil
+   description "Emacs Lisp developer support."
+   filename "xemacs-devel-1.13-pkg.tar.gz"
+   md5sum "3bec2cd2b955fa86617335ad14480e1a"
+   size 78840
+   provides (docref eldoc elp find-func hide-copyleft ielm regexp-opt trace)
+   requires (xemacs-base)
+   type single
+))
+(edict
+  (standards-version 1.0
+   version "1.03"
+   author-version "0.9.8"
+   date "1998-06-29"
+   build-date "1998-07-09"
+   maintainer "Stephen J. Turnbull <turnbull@sk.tsukuba.ac.jp>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "Lisp Interface to EDICT, Kanji Dictionary"
+   filename "edict-1.03-pkg.tar.gz"
+   md5sum "0f317174ab3e163780f26c6fcfe0eccb"
+   size 94823
+   provides (dui-registry dui edict-edit edict-english edict-japanese edict-morphology edict-test edict ts-mode)
+   requires (mule-base xemacs-base)
+   type regular
+))
+(egg-its
+  (standards-version 1.0
+   version "1.05"
+   author-version "21.0"
+   date "1998-06-20"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump t
+   description "Wnn (4.2 and 6) support.  SJ3 support."
+   filename "egg-its-1.05-pkg.tar.gz"
+   md5sum "ef131233410ea57fad940b40cb3c786c"
+   size 259670
+   provides (egg-cnpinyin egg-cnzhuyin egg-cwnn-leim egg-jisx0201 egg-jsymbol egg-kwnn-leim egg-leim egg-sj3-client egg-sj3-leim egg-sj3 egg-wnn egg)
+   requires (leim mule-base xemacs-base)
+   type regular
+))
+(leim
+  (standards-version 1.0
+   version "1.07"
+   author-version "21.0b36"
+   date "1998-04-09"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority medium
+   category "mule"
+   dump nil
+   description "Quail.  All non-English and non-Japanese language support."
+   filename "leim-1.07-pkg.tar.gz"
+   md5sum "91ef40389a36d7236ce3e9536c5097e1"
+   size 1744016
+   provides ()
+   requires (mule-base fsf-compat xemacs-base)
+   type regular
+))
+(locale
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0b35"
+   date "1998-03-01"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump nil
+   description "Localized menubars and localized splash screens."
+   filename "locale-1.04-pkg.tar.gz"
+   md5sum "5d6dd1391ac017f4f210a810db2541cb"
+   size 34651
+   provides ()
+   requires (mule-base)
+   type regular
+))
+(mule-base
+  (standards-version 1.0
+   version "1.19"
+   author-version "21.0"
+   date "1998-07-09"
+   build-date "1998-07-09"
+   maintainer "SL Baur <steve@altair.xemacs.org>"
+   distribution mule
+   priority high
+   category "mule"
+   dump t
+   description "Basic Mule support, required for building with Mule."
+   filename "mule-base-1.19-pkg.tar.gz"
+   md5sum "ac5ed26ee38de23d3591c37a283bc7b5"
+   size 488988
+   provides (canna-leim canna char-table china-util cyril-util isearch-ext japan-util ccl can-n-egg mule-help)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+(skk
+  (standards-version 1.0
+   version "1.06"
+   author-version "10.38"
+   date "1998-04-28"
+   build-date "1998-05-01"
+   maintainer "SL Baur <steve@altair.xemacs.org>"
+   distribution mule
+   priority medium
+   category "mule"
+   dump t
+   description "Japanese Language Input Method."
+   filename "skk-1.06-pkg.tar.gz"
+   md5sum "ccc92c60519be92efef3c40696897ef7"
+   size 1467006
+   provides (skk skk-tut)
+   requires (viper mule-base xemacs-base)
+   type regular
+))
+(calc
+  (standards-version 1.0
+   version "1.05"
+   author-version "2.02fX1"
+   date "1998-02-27"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "Emacs calculator"
+   filename "calc-1.05-pkg.tar.gz"
+   md5sum "cc170d1a19718a152144dfd0a66f6865"
+   size 1165091
+   provides (calc)
+   requires ()
+   type regular
+))
+(calendar
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0"
+   date "1998-06-19"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "Calendar and diary support."
+   filename "calendar-1.04-pkg.tar.gz"
+   md5sum "c0955508d51af1524ca8ef6687b362f1"
+   size 239851
+   provides (appt cal-dst cal-french cal-mayan cal-x cal-xemacs calendar diary-ins diary-lib holidays lunar solar)
+   requires (xemacs-base)
+   type regular
+))
+(edit-utils
+  (standards-version 1.0
+   version "1.24"
+   author-version "21.0"
+   date "1998-06-13"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "oa"
+   dump nil
+   description "Miscellaneous editor extensions, you probably need this."
+   filename "edit-utils-1.24-pkg.tar.gz"
+   md5sum "0b7136586f8b47e9b000bcf08f9b75a0"
+   size 584396
+   provides (abbrevlist atomic-extents avoid backup-dir balloon-help big-menubar blink-cursor blink-paren bookmark compare-w completion dabbrev desktop detached-minibuf edit-toolbar fast-lock file-part floating-toolbar flow-ctrl foldout func-menu hippie-exp icomplete id-select info-look iswitchb lazy-lock lazy-shot live-icon man mic-paren paren popper mode-motion+ outl-mouse page-ext blink-paren paren permanent-buffers recent-files redo reportmail rsz-minibuf saveconfsavehist saveplace scroll-in-place tempo toolbar-utils tree-menu uniquify where-was-i-db)
+   requires (xemacs-base)
+   type single
+))
+(forms
+  (standards-version 1.0
+   version "1.06"
+   author-version "2.10"
+   date "1998-01-25"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "oa"
+   dump nil
+   description "Forms editing support (obsolete, use Widget instead)."
+   filename "forms-1.06-pkg.tar.gz"
+   md5sum "ebee64ebf564f934e15fed3503e3b15e"
+   size 39948
+   provides (forms forms-mode)
+   requires ()
+   type regular
+))
+(frame-icon
+  (standards-version 1.0
+   version "1.02"
+   author-version "21.0b35"
+   date "1998-02-26"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "oa"
+   dump nil
+   description "Set up mode-specific icons for each frame under XEmacs"
+   filename "frame-icon-1.02-pkg.tar.gz"
+   md5sum "82d098425df2fd7e3a7e7d16c9a9e12b"
+   size 33568
+   provides (forms forms-mode)
+   requires ()
+   type regular
+))
+(hm--html-menus
+  (standards-version 1.0
+   version "1.06"
+   author-version "5.9"
+   date "1998-01-25"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "HTML editing."
+   filename "hm--html-menus-1.06-pkg.tar.gz"
+   md5sum "2570d8211b63c2edcc114ec3560a075f"
+   size 147168
+   provides (adapt hm--date hm--html-configuration hm--html-drag-and-drop hm--html-indentation hm--html-keys hm--html-menu hm--html-mode hm--html-not-standard hm--html html-view tmpl-minor-mode)
+   requires (xemacs-base)
+   type regular
+))
+(ispell
+  (standards-version 1.0
+   version "1.08"
+   author-version "3.0x1"
+   date "1998-04-01"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "Spell-checking with GNU ispell."
+   filename "ispell-1.08-pkg.tar.gz"
+   md5sum "54cd76987a472eca72c24592a10756d6"
+   size 64990
+   provides (ispell)
+   requires ()
+   type regular
+))
+(pc
+  (standards-version 1.0
+   version "1.10"
+   author-version "21.0b38"
+   date "1998-04-22"
+   build-date "1998-04-26"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "PC style interface emulation."
+   filename "pc-1.10-pkg.tar.gz"
+   md5sum "e750bebcb0d2b7632796b1c6c4fc4c16"
+   size 16004
+   provides (delbs fusion pc-select pending-del s-region)
+   requires (xemacs-base)
+   type regular
+))
+(psgml
+  (standards-version 1.0
+   version "1.08"
+   author-version "1.01"
+   date "1998-07-06"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "oa"
+   dump nil
+   description "Validated HTML/SGML editing."
+   filename "psgml-1.08-pkg.tar.gz"
+   md5sum "757842225e4d3e9841bf6de1d3fdbbc4"
+   size 419252
+   provides (psgml sgml)
+   requires (edit-utils)
+   type regular
+))
+(sgml
+  (standards-version 1.0
+   version "1.01"
+   author-version "21.0b35"
+   date "1998-01-25"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "oa"
+   dump nil
+   description "SGML/Linuxdoc-SGML editing."
+   filename "sgml-1.01-pkg.tar.gz"
+   md5sum "4e7039730eb4399c09b1a85d1758381c"
+   size 26874
+   provides (sgml linuxdoc-sgml)
+   requires (xemacs-base)
+   type regular
+))
+(slider
+  (standards-version 1.0
+   version "1.05"
+   author-version "0.3"
+   date "1998-01-25"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution experimental
+   priority low
+   category "oa"
+   dump nil
+   description "User interface tool."
+   filename "slider-1.05-pkg.tar.gz"
+   md5sum "67b376e5b886a78f5094eb13c61ff8ec"
+   size 12116
+   provides (slider color-selector)
+   requires ()
+   type regular
+))
+(speedbar
+  (standards-version 1.0
+   version "1.05"
+   author-version "0.6.2"
+   date "1998-02-07"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "oa"
+   dump nil
+   description "??? Document me."
+   filename "speedbar-1.05-pkg.tar.gz"
+   md5sum "8a988bada9d09dac0e934f0859f88613"
+   size 95018
+   provides (speedbar)
+   requires (xemacs-base)
+   type regular
+))
+(strokes
+  (standards-version 1.0
+   version "1.01"
+   author-version "21.0b35"
+   date "1998-01-25"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "oa"
+   dump nil
+   description "Mouse enhancement utility."
+   filename "strokes-1.01-pkg.tar.gz"
+   md5sum "a160a62e0570fc69f3c03b6ee1693fcd"
+   size 43743
+   provides (strokes)
+   requires (text-modes edit-utils mail-lib xemacs-base)
+   type regular
+))
+(text-modes
+  (standards-version 1.0
+   version "1.08"
+   author-version "21.0"
+   date "1998-07-03"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "oa"
+   dump nil
+   description "Miscellaneous support for editing text files."
+   filename "text-modes-1.08-pkg.tar.gz"
+   md5sum "7334a90ddbcedec459caecf8e0314bad"
+   size 171811
+   provides (autoinsert crontab-edit filladapt fold-isearch folding image-mode iso-acc iso-ascii iso-cvt iso-insert iso-swed swedish tabify whitespace-mode winmgr-mode xpm-mode xrdb-mode)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+(time
+  (standards-version 1.0
+   version "1.04"
+   author-version "1.17"
+   date "1998-04-24"
+   build-date "1998-04-26"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "oa"
+   dump nil
+   description "Display time & date on the modeline."
+   filename "time-1.04-pkg.tar.gz"
+   md5sum "e25caf29cf9684887460d9cd124639d4"
+   size 19905
+   provides (time)
+   requires (xemacs-base)
+   type regular
+))
+(eterm
+  (standards-version 1.0
+   version "1.05"
+   author-version "21.0"
+   date "1998-06-28"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "os"
+   dump nil
+   description "Terminal emulation."
+   filename "eterm-1.05-pkg.tar.gz"
+   md5sum "0c1660a9a8426077534caf84762e7ec1"
+   size 144233
+   provides (eterm)
+   requires (xemacs-base)
+   type regular
+))
+(igrep
+  (standards-version 1.0
+   version "1.01"
+   author-version "21.0b35"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "os"
+   dump nil
+   description "Enhanced front-end for Grep."
+   filename "igrep-1.01-pkg.tar.gz"
+   md5sum "e50e3a5ac2d6ca5eea67d7f664dee406"
+   size 13971
+   provides (igrep)
+   requires (dired xemacs-base)
+   type regular
+))
+(ilisp
+  (standards-version 1.0
+   version "1.04"
+   author-version "5.8"
+   date "1998-01-24"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "os"
+   dump nil
+   description "Front-end for Inferior Lisp."
+   filename "ilisp-1.04-pkg.tar.gz"
+   md5sum "1fa1b08bd6b7cc3c71f512ad412e1b24"
+   size 223559
+   provides (ilisp completer)
+   requires (xemacs-base)
+   type regular
+))
+(os-utils
+  (standards-version 1.0
+   version "1.08"
+   author-version "21.0"
+   date "1998-06-07"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "os"
+   dump nil
+   description "Miscellaneous O/S utilities."
+   filename "os-utils-1.08-pkg.tar.gz"
+   md5sum "9fdcc24ee2d83c6d214f4afa1f41c617"
+   size 229921
+   provides (archive-mode background crypt crypt++ inf-lisp jka-compr lpr mchat ps-print tar-mode telnet terminal uncompress)
+   requires (xemacs-base)
+   type single
+))
+(view-process
+  (standards-version 1.0
+   version "1.03"
+   author-version "2.4"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "os"
+   dump nil
+   description "A Unix process browsing tool."
+   filename "view-process-1.03-pkg.tar.gz"
+   md5sum "96bcf35e325034ee3c37563fecfe623d"
+   size 59886
+   provides (view-process-mode)
+   requires (xemacs-base)
+   type regular
+))
+(ada
+  (standards-version 1.0
+   version "1.03"
+   author-version "2.27"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump nil
+   description "Ada language support."
+   filename "ada-1.03-pkg.tar.gz"
+   md5sum "661f8c0ac17fe447f8cc0e54f753704d"
+   size 54323
+   provides (ada-mode ada-stmt)
+   requires ()
+   type regular
+))
+(c-support
+  (standards-version 1.0
+   version "1.07"
+   author-version "21.0b35"
+   date "1998-03-25"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "prog"
+   dump nil
+   description "Basic single-file add-ons for editing C code."
+   filename "c-support-1.07-pkg.tar.gz"
+   md5sum "771e606d76e18922efb6559e101c7ecf"
+   size 68651
+   provides (c-comment-edit cmacexp ctypes hideif hideshow)
+   requires (cc-mode xemacs-base)
+   type regular
+))
+(cc-mode
+  (standards-version 1.0
+   version "1.11"
+   author-version "5.22"
+   date "1998-03-05"
+   build-date "1998-06-14"
+   maintainer "Barry Warsaw <cc-mode-help@python.org>"
+   distribution stable
+   priority medium
+   category "prog"
+   dump nil
+   description "C, C++ and Java language support."
+   filename "cc-mode-1.11-pkg.tar.gz"
+   md5sum "dadf89d5a4dfbee90d0168831a33150f"
+   size 151138
+   provides (cc-mode)
+   requires (xemacs-base)
+   type regular
+))
+(debug
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0"
+   date "1998-07-09"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "prog"
+   dump nil
+   description "GUD, gdb, dbx debugging support."
+   filename "debug-1.04-pkg.tar.gz"
+   md5sum "f881ca1a0593d218ca6a0e19dd10d8a0"
+   size 90350
+   provides (dbx gdb-highlight gdb gdbsrc gud history)
+   requires (xemacs-base)
+   type regular
+))
+(ediff
+  (standards-version 1.0
+   version "1.08"
+   author-version "2.70.1"
+   date "1998-04-27"
+   build-date "1998-05-15"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "prog"
+   dump nil
+   description "Interface over GNU patch."
+   filename "ediff-1.08-pkg.tar.gz"
+   md5sum "d73e47087119a6cb7d5b4f71fdba8b72"
+   size 243042
+   provides (ediff)
+   requires (pcl-cvs dired xemacs-base)
+   type regular
+))
+(emerge
+  (standards-version 1.0
+   version "1.02"
+   author-version "21.0b36"
+   date "1998-04-07"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump nil
+   description "Another interface over GNU patch."
+   filename "emerge-1.02-pkg.tar.gz"
+   md5sum "6f7687196172109d6014346d5ead6d3a"
+   size 60940
+   provides (emerge)
+   requires ()
+   type regular
+))
+(jde
+  (standards-version 1.0
+   version "1.04"
+   author-version "2.05"
+   date "1998-07-09"
+   build-date "1998-07-09"
+   maintainer "Andy Piper <andyp@parallax.co.uk>"
+   distribution stable
+   priority medium
+   category "prog"
+   dump nil
+   description "Java language and development support."
+   filename "jde-1.04-pkg.tar.gz"
+   md5sum "97b90e88928033f405005a9441b7e141"
+   size 126784
+   provides (jde)
+   requires (cc-mode debug speedbar edit-utils mail-lib xemacs-base)
+   type regular
+))
+(pcl-cvs
+  (standards-version 1.0
+   version "1.11"
+   author-version "21.0"
+   date "1998-06-18"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump nil
+   description "CVS frontend."
+   filename "pcl-cvs-1.11-pkg.tar.gz"
+   md5sum "7592786d2734d87778915e50561c472d"
+   size 141698
+   provides (pcl-cvs dll elib-node generic-sc)
+   requires (xemacs-base)
+   type regular
+))
+(prog-modes
+  (standards-version 1.0
+   version "1.06"
+   author-version "21.0"
+   date "1998-05-04"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "prog"
+   dump nil
+   description "Support for various programming languages."
+   filename "prog-modes-1.06-pkg.tar.gz"
+   md5sum "38d494e334b846fe735f45d573759ed9"
+   size 539915
+   provides (autoconf-mode cperl-mode eiffel3 f90 fortran ksh-mode m4-mode makefile perl-mode postscript python-mode rexx-mode simula-mode tcl teco verilog-mod)
+   requires (mail-lib xemacs-base)
+   type regular
+))
+(scheme
+  (standards-version 1.0
+   version "1.03"
+   author-version "21.0b36"
+   date "1998-04-11"
+   build-date "1998-04-17"
+   maintainer "Karl M. Hegbloom <karlheg@bittersweet.inetarena.com>"
+   distribution contrib
+   priority low
+   category "prog"
+   dump nil
+   description "Front-end support for Inferior Scheme."
+   filename "scheme-1.03-pkg.tar.gz"
+   md5sum "f22026713da1be70eba93f8d59700499"
+   size 36833
+   provides (scheme xscheme cmuscheme cmuscheme48)
+   requires (xemacs-base)
+   type regular
+))
+(sh-script
+  (standards-version 1.0
+   version "1.05"
+   author-version "2.0e"
+   date "1998-05-12"
+   build-date "1998-05-15"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump nil
+   description "Support for editing shell scripts."
+   filename "sh-script-1.05-pkg.tar.gz"
+   md5sum "8462bd33b9edc71da72ebd134b8a77c6"
+   size 33785
+   provides (sh-script executable)
+   requires (xemacs-base)
+   type regular
+))
+(vc-cc
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0"
+   date "1998-06-30"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "prog"
+   dump t
+   description "Version Control for ClearCase (UnFree) systems."
+   filename "vc-cc-1.04-pkg.tar.gz"
+   md5sum "07557cc75c0b2aafc5966cca1c0a22e2"
+   size 96262
+   provides (vc)
+   requires (dired xemacs-base)
+   type regular
+))
+(vc
+  (standards-version 1.0
+   version "1.09"
+   author-version "21.0b42"
+   date "1998-05-30"
+   build-date "1998-06-01"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump t
+   description "Version Control for Free systems."
+   filename "vc-1.09-pkg.tar.gz"
+   md5sum "233d46c01ab9e5052395cf730420f41d"
+   size 83688
+   provides (vc)
+   requires (dired xemacs-base)
+   type regular
+))
+(vhdl
+  (standards-version 1.0
+   version "1.04"
+   author-version "2.74"
+   date "1998-01-24"
+   build-date "1998-06-14"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "prog"
+   dump nil
+   description "Support for VHDL."
+   filename "vhdl-1.04-pkg.tar.gz"
+   md5sum "8de144972dd6f33bcdd43314e6e6564d"
+   size 54169
+   provides (vhdl-mode)
+   requires ()
+   type regular
+))
+(auctex
+  (standards-version 1.0
+   version "1.08"
+   author-version "9.7p"
+   date "1998-04-10"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority medium
+   category "wp"
+   dump nil
+   description "Basic TeX/LaTeX support."
+   filename "auctex-1.08-pkg.tar.gz"
+   md5sum "e79c956bd2a7cfc086d91c399667c2ef"
+   size 305607
+   provides (auc-old bib-cite font-latex latex multi-prompt tex-buf tex-info tex-jp tex-site tex)
+   requires (xemacs-base)
+   type regular
+))
+(crisp
+  (standards-version 1.0
+   version "1.04"
+   author-version "1.33"
+   date "1998-01-24"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "wp"
+   dump nil
+   description "Crisp/Brief emulation."
+   filename "crisp-1.04-pkg.tar.gz"
+   md5sum "2a51917984d7556019b1b20ff85a9feb"
+   size 10189
+   provides (crisp scroll-lock)
+   requires ()
+   type regular
+))
+(edt
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0b36"
+   date "1998-04-07"
+   build-date "1998-04-17"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution contrib
+   priority low
+   category "wp"
+   dump nil
+   description "DEC EDIT/EDT emulation."
+   filename "edt-1.04-pkg.tar.gz"
+   md5sum "fabfedc63988de7296eae068d8b78ae0"
+   size 46095
+   provides (edt)
+   requires (xemacs-base)
+   type regular
+))
+(reftex
+  (standards-version 1.0
+   version "1.04"
+   author-version "3.22"
+   date "1998-03-21"
+   build-date "1998-04-04"
+   maintainer "Carsten Dominik <dominik@strw.LeidenUniv.nl>"
+   distribution stable
+   priority medium
+   category "wp"
+   dump nil
+   description "Emacs support for LaTeX cross-references, citations.."
+   filename "reftex-1.04-pkg.tar.gz"
+   md5sum "817a50763a3e909449a93780f662723c"
+   size 141810
+   provides (reftex)
+   requires (fsf-compat xemacs-base)
+   type regular
+))
+(texinfo
+  (standards-version 1.0
+   version "1.09"
+   author-version "21.0"
+   date "1998-07-01"
+   build-date "1998-07-09"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority high
+   category "wp"
+   dump nil
+   description "XEmacs TeXinfo support."
+   filename "texinfo-1.09-pkg.tar.gz"
+   md5sum "7ab1fa9774456869027cfc0846d8f3fc"
+   size 127683
+   provides (makeinfo tex-mode texinfmt texinfo texnfo-tex texnfo-upd)
+   requires (xemacs-base)
+   type regular
+))
+(textools
+  (standards-version 1.0
+   version "1.05"
+   author-version "21.0b38"
+   date "1998-04-29"
+   build-date "1998-05-01"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stabl
+   priority medium
+   category "wp"
+   dump nil
+   description "Miscellaneous TeX support."
+   filename "textools-1.05-pkg.tar.gz"
+   md5sum "4b0a417849ca270ed498c1e9c9aaa07b"
+   size 79125
+   provides (bib-mode bibtex refer-to-bibtex)
+   requires (xemacs-base)
+   type single
+))
+(tpu
+  (standards-version 1.0
+   version "1.04"
+   author-version "21.0b35"
+   date "1998-01-24"
+   build-date "1998-04-04"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution mule
+   priority high
+   category "wp"
+   dump nil
+   description "DEC EDIT/TPU support."
+   filename "tpu-1.04-pkg.tar.gz"
+   md5sum "f45c9f761d6a88b2d3bdb4a4af2abf25"
+   size 57425
+   provides (tpu)
+   requires ()
+   type regular
+))
+(viper
+  (standards-version 1.0
+   version "1.08"
+   author-version "3.03"
+   date "1998-02-25"
+   build-date "1998-06-01"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution stable
+   priority low
+   category "wp"
+   dump nil
+   description "VI emulation support."
+   filename "viper-1.08-pkg.tar.gz"
+   md5sum "f36b7e49bda79a19d7beeeeb6092bedd"
+   size 261090
+   provides (viper)
+   requires (xemacs-base)
+   type regular
+))
+))
+(provide 'package-get-base)
index b64dc0b..3d07560 100644 (file)
         (paths-decode-directory-path path-envval 'drop-empties)))
    (packages-find-package-exec-path early-packages)
    (packages-find-package-exec-path late-packages)
+   (packages-find-package-exec-path last-packages)
    (let ((emacspath-envval (getenv "EMACSPATH")))
      (and emacspath-envval
          (split-path emacspath-envval)))
    (and exec-directory
-       (list exec-directory))
-   (packages-find-package-exec-path last-packages)))
+       (list exec-directory))))
 
 (defun paths-find-data-directory (roots)
   "Find the data directory."
   (append
    (packages-find-package-data-path early-packages)
    (packages-find-package-data-path late-packages)
-   (list data-directory)
-   (packages-find-package-data-path last-packages)))
+   (packages-find-package-data-path last-packages)
+   (list data-directory)))
 
 ;;; setup-paths.el ends here
index c601f84..19cbcc3 100644 (file)
@@ -402,10 +402,10 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n")
     
     (if (not inhibit-autoloads)
        (progn
-         (if (not inhibit-early-packages)
-             (packages-load-package-auto-autoloads early-package-load-path))
+         (packages-load-package-auto-autoloads last-package-load-path)
          (packages-load-package-auto-autoloads late-package-load-path)
-         (packages-load-package-auto-autoloads last-package-load-path)))
+         (if (not inhibit-early-packages)
+             (packages-load-package-auto-autoloads early-package-load-path))))
 
     (unwind-protect
        (command-line)
@@ -680,7 +680,7 @@ If this is nil, no message will be displayed.")
           (message "Error in init file: %s" (error-message-string error))
           (display-warning 'initialization
             (format "\
-An error has occurred while loading %s:
+An error has occured while loading %s:
 
 %s
 
@@ -935,7 +935,7 @@ a new format, when variables have changed, etc."
                                 " to see what this means.\n")))
        `( "\n"))
     (face bold-italic "\
-Copyright (C) 1985-1998 Free Software Foundation, Inc.
+Copyright (C) 1985-1997 Free Software Foundation, Inc.
 Copyright (C) 1990-1994 Lucid, Inc.
 Copyright (C) 1993-1997 Sun Microsystems, Inc. All Rights Reserved.
 Copyright (C) 1994-1996 Board of Trustees, University of Illinois
index bddaf12..45b5e1d 100644 (file)
@@ -71,7 +71,7 @@
 (load "setup-paths.el")
 (load "dump-paths.el")
 
-(let ((autol (packages-list-autoloads (concat default-directory "../lisp"))))
+(let ((autol (packages-list-autoloads)))
   ;; (print (prin1-to-string autol))
   (while autol
     (let ((src (car autol)))
diff --git a/lisp/winnt.el b/lisp/winnt.el
new file mode 100644 (file)
index 0000000..b0898a9
--- /dev/null
@@ -0,0 +1,137 @@
+;;; winnt.el --- Lisp routines for Windows NT.
+
+;; Copyright (C) 1994 Free Software Foundation, Inc.
+
+;; Maintainer: XEmacs Development Team
+;; Keywords: mouse, dumped
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with: Not synched with FSF.  Almost completely divergent.
+
+;;; Commentary:
+
+;; This file is dumped with XEmacs for MS Windows (without cygwin).
+
+;; Based on NT Emacs version by Geoff Voelker (voelker@cs.washington.edu)
+;; Ported to XEmacs by Marc Paquette <marcpa@cam.org>
+;; Largely modified by Kirill M. Katsnelson <kkm@kis.ru>
+
+;;; Code:
+
+;; The cmd.exe shell uses the "/c" switch instead of the "-c" switch
+;; for executing its command line argument (from simple.el).
+;; #### Oh if we had an alist of shells and their command switches.
+(setq shell-command-switch "/c")
+
+;; For appending suffixes to directories and files in shell completions.
+(defun nt-shell-mode-hook ()
+  (setq comint-completion-addsuffix '("\\" . " ")
+       comint-process-echoes t))
+(add-hook 'shell-mode-hook 'nt-shell-mode-hook)
+
+;; Use ";" instead of ":" as a path separator (from files.el).
+(setq path-separator ";")
+
+;; Set the null device (for compile.el).
+;; #### There should be such a global thingy as null-device - kkm
+(setq grep-null-device "NUL")
+
+;; Set the grep regexp to match entries with drive letters.
+(setq grep-regexp-alist
+  '(("^\\(\\([a-zA-Z]:\\)?[^:( \t\n]+\\)[:( \t]+\\([0-9]+\\)[:) \t]" 1 3)))
+
+;;----------------------------------------------------------------------
+;; Autosave hack
+;;--------------------
+
+;; Avoid creating auto-save file names containing invalid characters
+;; (primarily "*", eg. for the *mail* buffer).
+;; Avoid "doc lost for function" warning
+(defun original-make-auto-save-file-name (&optional junk)
+  "You do not want to call this."
+  )
+(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))
+
+;;----------------------------------------------------------------------
+;; Quoting process args
+;;--------------------
+
+(defun nt-quote-args-verbatim (args)
+  "Copy ARG list verbatim, separating each arg with space."
+  (mapconcat 'identity args " "))
+
+(defun nt-quote-args-prefix-quote (prefix args)
+  (mapconcat (lambda (str)
+              (concat "\""
+                      (mapconcat (lambda (ch)
+                                   (concat (if (eq ch ?\") prefix)
+                                           (char-to-string ch)))
+                                 str nil)
+                      "\""))
+              args " "))
+
+(defun nt-quote-args-backslash-quote (args)
+  "Place ARG list in quotes, prefixing quotes in args with backslashes."
+  (nt-quote-args-prefix-quote "\\" args))
+
+(defun nt-quote-args-double-quote (args)
+  "Place ARG list in quotes, doubling quotes in args."
+  (nt-quote-args-prefix-quote "\"" args))
+
+(defvar nt-quote-args-functions-alist
+  '(("^.?.?sh\\." . nt-quote-args-double-quote))
+  "An alist for determining proper argument quoting given executable file name.
+Car of each cons must be a string, a regexp against which a file name sans 
+directory is matched.  Cdr is a function symbol.  The list is mathced in
+forward order, and mathcing entry cdr's funcrion is called with a list of
+strings, process arguments.  It must return a string which is passed to
+the newly created process.
+
+If not found, then `nt-quote-args-verbatim' is called on the argument list.")
+
+(defun nt-quote-process-args (args)
+  ;;Properly quote process ARGS for executing (car ARGS).
+  (let ((fname (file-name-nondirectory (car args)))
+       (alist nt-quote-args-functions-alist)
+       (case-fold-search nil)
+       (return-me nil)
+       (assoc nil))
+    (while (and alist
+               (null return-me))
+      (setq assoc (pop alist))
+      (if (string-match (car assoc) fname)
+         (setq return-me (funcall (cdr assoc) (cdr args)))))
+    (or return-me
+       (nt-quote-args-verbatim (cdr args)))))
+
+;;; winnt.el ends here
diff --git a/lock/.precious b/lock/.precious
new file mode 100644 (file)
index 0000000..1650a2e
--- /dev/null
@@ -0,0 +1 @@
+Dummy file to keep CVS happy.
diff --git a/lwlib/config.h b/lwlib/config.h
new file mode 100644 (file)
index 0000000..34aab2c
--- /dev/null
@@ -0,0 +1,33 @@
+/* lwlib/config.h.  Generated automatically by configure.  */
+/* Lwlib site configuration template file.  -*- C -*-
+   Copyright (C) 1997 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Not in FSF. */
+
+#ifndef _LWLIB_CONFIG_H_
+#define _LWLIB_CONFIG_H_
+
+#include <../src/config.h>
+
+/* #undef NEED_MOTIF */
+/* #undef NEED_ATHENA */
+/* #undef NEED_LUCID */
+
+#endif /* _LWLIB_CONFIG_H_ */
diff --git a/man/info-stnd.texi b/man/info-stnd.texi
new file mode 100644 (file)
index 0000000..abb7ff8
--- /dev/null
@@ -0,0 +1,1373 @@
+\input texinfo    @c -*-texinfo-*-
+@comment %**start of header
+@setfilename ../info/info-stnd.info
+@settitle GNU Info
+@set InfoProgVer 2.11
+@paragraphindent none
+@footnotestyle end
+@synindex vr cp
+@synindex fn cp
+@synindex ky cp
+@comment %**end of header
+@comment $Id: info-stnd.texi,v 1.3 1998/06/30 06:35:28 steve Exp $
+
+@dircategory Texinfo documentation system
+@direntry
+* info program: (info-stnd).    Standalone Info-reading program.
+@end direntry
+
+@ifinfo
+This file documents GNU Info, a program for viewing the on-line formatted
+versions of Texinfo files.  This documentation is different from the
+documentation for the Info reader that is part of GNU Emacs.  If you do
+not know how to use Info, but have a working Info reader, you should
+read that documentation first.
+
+Copyright @copyright{} 1992, 93, 96, 97 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries a copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+@end ignore
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU Info User's Guide
+@subtitle For GNU Info version @value{InfoProgVer}
+@author Brian J. Fox (bfox@@ai.mit.edu)
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992, 1993, 1997 Free Software Foundation
+
+Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+sections entitled ``Copying'' and ``GNU General Public License'' are
+included exactly as in the original, and provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation
+approved by the Free Software Foundation.
+@end titlepage
+
+@ifinfo
+@node Top, What is Info, , (dir)
+@top The GNU Info Program
+
+This file documents GNU Info, a program for viewing the on-line
+formatted versions of Texinfo files, version @value{InfoProgVer}.  This
+documentation is different from the documentation for the Info reader
+that is part of GNU Emacs.
+@end ifinfo
+
+@menu
+* What is Info::                
+* Options::                     Options you can pass on the command line.
+* Cursor Commands::             Commands which move the cursor within a node.
+* Scrolling Commands::          Commands for moving the node around 
+                                  in a window.
+* Node Commands::               Commands for selecting a new node.
+* Searching Commands::          Commands for searching an Info file.
+* Xref Commands::               Commands for selecting cross references.
+* Window Commands::             Commands which manipulate multiple windows.
+* Printing Nodes::              How to print out the contents of a node.
+* Miscellaneous Commands::      A few commands that defy categories.
+* Variables::                   How to change the default behavior of Info.
+* GNU Info Global Index::       Global index containing keystrokes, 
+                                  command names, variable names, 
+                                  and general concepts.
+@end menu
+
+@node What is Info, Options, Top, Top
+@chapter What is Info?
+
+@iftex
+This file documents GNU Info, a program for viewing the on-line formatted
+versions of Texinfo files, version @value{InfoProgVer}.
+@end iftex
+
+@dfn{Info} is a program which is used to view Info files on an ASCII
+terminal.  @dfn{Info files} are the result of processing Texinfo files
+with the program @code{makeinfo} or with one of the Emacs commands, such
+as @code{M-x texinfo-format-buffer}.  Texinfo itself is a documentation
+system that uses a single source file to produce both on-line
+information and printed output.  You can typeset and print the
+files that you read in Info.@refill
+
+@node Options, Cursor Commands, What is Info, Top
+@chapter Command Line Options
+@cindex command line options
+@cindex arguments, command line
+
+GNU Info accepts several options to control the initial node being
+viewed, and to specify which directories to search for Info files.  Here
+is a template showing an invocation of GNU Info from the shell:
+
+@example
+info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{}
+@end example
+
+The following @var{option-names} are available when invoking Info from
+the shell:
+
+@table @code
+@cindex directory path
+@item --directory @var{directory-path}
+@itemx -d @var{directory-path}
+Add @var{directory-path} to the list of directory paths searched when
+Info needs to find a file.  You may issue @code{--directory} multiple
+times; once for each directory which contains Info files.
+Alternatively, you may specify a value for the environment variable
+@code{INFOPATH}; if @code{--directory} is not given, the value of
+@code{INFOPATH} is used.  The value of @code{INFOPATH} is a colon
+separated list of directory names.  If you do not supply @code{INFOPATH}
+or @code{--directory-path}, Info uses a default path.
+
+@item --file @var{filename}
+@itemx -f @var{filename}
+@cindex Info file, selecting
+Specify a particular Info file to visit.  By default, Info visits
+the file @code{dir}; if you use this option, Info will start with
+@code{(@var{filename})Top} as the first file and node.
+
+@item --index-search @var{string}
+@cindex index search, selecting
+@cindex online help, using Info as
+Go to the index entry @var{string} in the Info file specified with
+@samp{--file}.  If no such entry, print @samp{no entries found} and exit
+with nonzero status.  This can used from another program as a way to
+provide online help.
+
+@item --node @var{nodename}
+@itemx -n @var{nodename}
+@cindex node, selecting
+Specify a particular node to visit in the initial file that Info
+loads.  This is especially useful in conjunction with
+@code{--file}@footnote{Of course, you can specify both the file and node
+in a @code{--node} command; but don't forget to escape the open and
+close parentheses from the shell as in: @code{info --node
+"(emacs)Buffers"}}.  You may specify @code{--node} multiple times; for
+an interactive Info, each @var{nodename} is visited in its own window,
+for a non-interactive Info (such as when @code{--output} is given) each
+@var{nodename} is processed sequentially.
+
+@item --output @var{filename}
+@itemx -o @var{filename}
+@cindex file, outputting to
+@cindex outputting to a file
+Specify @var{filename} as the name of a file to which to direct output.
+Each node that Info visits will be output to @var{filename} instead of
+interactively viewed.  A value of @code{-} for @var{filename} specifies
+the standard output.
+
+@item --subnodes
+@cindex @code{--subnodes}, command line option
+This option only has meaning when given in conjunction with
+@code{--output}.  It means to recursively output the nodes appearing in
+the menus of each node being output.  Menu items which resolve to
+external Info files are not output, and neither are menu items which are
+members of an index.  Each node is only output once.
+
+@item --help
+@itemx -h
+Produces a relatively brief description of the available Info options.
+
+@item --version
+@cindex version information
+Prints the version information of Info and exits.
+
+@item @var{menu-item}
+@cindex menu, following
+Info treats its remaining arguments as the names of menu items.  The
+first argument is a menu item in the initial node visited, while
+the second argument is a menu item in the first argument's node.
+You can easily move to the node of your choice by specifying the menu
+names which describe the path to that node.  For example,
+
+@example
+info emacs buffers
+@end example
+
+@noindent
+first selects the menu item @samp{Emacs} in the node @samp{(dir)Top},
+and then selects the menu item @samp{Buffers} in the node
+@samp{(emacs)Top}.
+@end table
+
+@node Cursor Commands, Scrolling Commands, Options, Top
+@chapter Moving the Cursor
+@cindex cursor, moving
+
+Many people find that reading screens of text page by page is made
+easier when one is able to indicate particular pieces of text with some
+kind of pointing device.  Since this is the case, GNU Info (both the
+Emacs and standalone versions) have several commands which allow you to
+move the cursor about the screen.  The notation used in this manual to
+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.
+
+The following table lists the basic cursor movement commands in Info.
+Each entry consists of the key sequence you should type to execute the
+cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it
+invokes @code{execute-extended-command}.  @xref{M-x, , Executing an
+extended command, emacs, the GNU Emacs Manual}, for more detailed
+information.} command name (displayed in parentheses), and a short
+description of what the command does.  All of the cursor motion commands
+can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands,
+@code{universal-argument}}), to find out how to supply them.  With a
+numeric argument, the motion commands are simply executed that
+many times; for example, a numeric argument of 4 given to
+@code{next-line} causes the cursor to move down 4 lines.  With a
+negative numeric argument, the motion is reversed; an argument of -4
+given to the @code{next-line} command would cause the cursor to move
+@emph{up} 4 lines.
+
+@table @asis
+@item @code{C-n} (@code{next-line})
+@kindex C-n
+@findex next-line
+Move the cursor down to the next line.
+
+@item @code{C-p} (@code{prev-line})
+@kindex C-p
+@findex prev-line
+Move the cursor up to the previous line.
+
+@item @code{C-a} (@code{beginning-of-line})
+@kindex C-a, in Info windows
+@findex beginning-of-line
+Move the cursor to the start of the current line.
+
+@item @code{C-e} (@code{end-of-line})
+@kindex C-e, in Info windows
+@findex end-of-line
+Move the cursor to the end of the current line.
+
+@item @code{C-f} (@code{forward-char})
+@kindex C-f, in Info windows
+@findex forward-char
+Move the cursor forward a character.
+
+@item @code{C-b} (@code{backward-char})
+@kindex C-b, in Info windows
+@findex backward-char
+Move the cursor backward a character.
+
+@item @code{M-f} (@code{forward-word})
+@kindex M-f, in Info windows
+@findex forward-word
+Move the cursor forward a word.
+
+@item @code{M-b} (@code{backward-word})
+@kindex M-b, in Info windows
+@findex backward-word
+Move the cursor backward a word.
+
+@item @code{M-<} (@code{beginning-of-node})
+@itemx @code{b}
+@kindex b, in Info windows
+@kindex M-<
+@findex beginning-of-node
+Move the cursor to the start of the current node.
+
+@item @code{M->} (@code{end-of-node})
+@kindex M->
+@findex end-of-node
+Move the cursor to the end of the current node.
+
+@item @code{M-r} (@code{move-to-window-line})
+@kindex M-r
+@findex move-to-window-line
+Move the cursor to a specific line of the window.  Without a numeric
+argument, @code{M-r} moves the cursor to the start of the line in the
+center of the window.  With a numeric argument of @var{n}, @code{M-r}
+moves the cursor to the start of the @var{n}th line in the window.
+@end table
+
+@node Scrolling Commands, Node Commands, Cursor Commands, Top
+@chapter Moving Text Within a Window
+@cindex scrolling
+
+Sometimes you are looking at a screenful of text, and only part of the
+current paragraph you are reading is visible on the screen.  The
+commands detailed in this section are used to shift which part of the
+current node is visible on the screen.
+
+@table @asis
+@item @code{SPC} (@code{scroll-forward})
+@itemx @code{C-v}
+@kindex SPC, in Info windows
+@kindex C-v
+@findex scroll-forward
+Shift the text in this window up.  That is, show more of the node which
+is currently below the bottom of the window.  With a numeric argument,
+show that many more lines at the bottom of the window; a numeric
+argument of 4 would shift all of the text in the window up 4 lines
+(discarding the top 4 lines), and show you four new lines at the bottom
+of the window.  Without a numeric argument, @key{SPC} takes the bottom
+two lines of the window and places them at the top of the window,
+redisplaying almost a completely new screenful of lines.
+
+@item @code{DEL} (@code{scroll-backward})
+@itemx @code{M-v}
+@kindex DEL, in Info windows
+@kindex M-v
+@findex scroll-backward
+Shift the text in this window down.  The inverse of
+@code{scroll-forward}.
+@end table
+
+@cindex scrolling through node structure
+The @code{scroll-forward} and @code{scroll-backward} commands can also
+move forward and backward through the node structure of the file.  If
+you press @key{SPC} while viewing the end of a node, or @key{DEL} while
+viewing the beginning of a node, what happens is controlled by the
+variable @code{scroll-behavior}.  @xref{Variables,
+@code{scroll-behavior}}, for more information.
+
+@table @asis
+@item @code{C-l} (@code{redraw-display})
+@kindex C-l
+@findex redraw-display
+Redraw the display from scratch, or shift the line containing the cursor
+to a specified location.  With no numeric argument, @samp{C-l} clears
+the screen, and then redraws its entire contents.  Given a numeric
+argument of @var{n}, the line containing the cursor is shifted so that
+it is on the @var{n}th line of the window.
+
+@item @code{C-x w} (@code{toggle-wrap})
+@kindex C-w
+@findex toggle-wrap
+Toggles the state of line wrapping in the current window.  Normally,
+lines which are longer than the screen width @dfn{wrap}, i.e., they are
+continued on the next line.  Lines which wrap have a @samp{\} appearing
+in the rightmost column of the screen.  You can cause such lines to be
+terminated at the rightmost column by changing the state of line
+wrapping in the window with @code{C-x w}.  When a line which needs more
+space than one screen width to display is displayed, a @samp{$} appears
+in the rightmost column of the screen, and the remainder of the line is
+invisible.
+@end table
+
+@node Node Commands, Searching Commands, Scrolling Commands, Top
+@chapter Selecting a New Node
+@cindex nodes, selection of
+
+This section details the numerous Info commands which select a new node
+to view in the current window.
+
+The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and
+@samp{l}.
+
+When you are viewing a node, the top line of the node contains some Info
+@dfn{pointers} which describe where the next, previous, and up nodes
+are.  Info uses this line to move about the node structure of the file
+when you use the following commands:
+
+@table @asis
+@item @code{n} (@code{next-node})
+@kindex n
+@findex next-node
+Select the `Next' node.  
+
+@item @code{p} (@code{prev-node})
+@kindex p
+@findex prev-node
+Select the `Prev' node.
+
+@item @code{u} (@code{up-node})
+@kindex u
+@findex up-node
+Select the `Up' node.
+@end table
+
+You can easily select a node that you have already viewed in this window
+by using the @samp{l} command -- this name stands for "last", and
+actually moves through the list of already visited nodes for this
+window.  @samp{l} with a negative numeric argument moves forward through
+the history of nodes for this window, so you can quickly step between
+two adjacent (in viewing history) nodes.
+
+@table @asis
+@item @code{l} (@code{history-node})
+@kindex l
+@findex history-node
+Select the most recently selected node in this window.
+@end table
+
+Two additional commands make it easy to select the most commonly
+selected nodes; they are @samp{t} and @samp{d}.
+
+@table @asis
+@item @code{t} (@code{top-node})
+@kindex t
+@findex top-node
+Select the node @samp{Top} in the current Info file.
+
+@item @code{d} (@code{dir-node})
+@kindex d
+@findex dir-node
+Select the directory node (i.e., the node @samp{(dir)}).
+@end table
+
+Here are some other commands which immediately result in the selection
+of a different node in the current window:
+
+@table @asis
+@item @code{<} (@code{first-node})
+@kindex <
+@findex first-node
+Selects the first node which appears in this file.  This node is most
+often @samp{Top}, but it does not have to be.
+
+@item @code{>} (@code{last-node})
+@kindex >
+@findex last-node
+Select the last node which appears in this file.
+
+@item @code{]} (@code{global-next-node})
+@kindex ]
+@findex global-next-node
+Move forward or down through node structure.  If the node that you are
+currently viewing has a @samp{Next} pointer, that node is selected.
+Otherwise, if this node has a menu, the first menu item is selected.  If
+there is no @samp{Next} and no menu, the same process is tried with the
+@samp{Up} node of this node.
+
+@item @code{[} (@code{global-prev-node})
+@kindex [
+@findex global-prev-node
+Move backward or up through node structure.  If the node that you are
+currently viewing has a @samp{Prev} pointer, that node is selected.
+Otherwise, if the node has an @samp{Up} pointer, that node is selected,
+and if it has a menu, the last item in the menu is selected.
+@end table
+
+You can get the same behavior as @code{global-next-node} and
+@code{global-prev-node} while simply scrolling through the file with
+@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for
+more information.
+
+@table @asis
+@item @code{g} (@code{goto-node})
+@kindex g
+@findex goto-node
+Read the name of a node and select it.  No completion is done while
+reading the node name, since the desired node may reside in a separate
+file.  The node must be typed exactly as it appears in the Info file.  A
+file name may be included as with any node specification, for example
+
+@example
+@code{g(emacs)Buffers}
+@end example
+
+finds the node @samp{Buffers} in the Info file @file{emacs}.
+
+@item @code{C-x k} (@code{kill-node})
+@kindex C-x k
+@findex kill-node
+Kill a node.  The node name is prompted for in the echo area, with a
+default of the current node.  @dfn{Killing} a node means that Info tries
+hard to forget about it, removing it from the list of history nodes kept
+for the window where that node is found.  Another node is selected in
+the window which contained the killed node.
+
+@item @code{C-x C-f} (@code{view-file})
+@kindex C-x C-f
+@findex view-file
+Read the name of a file and selects the entire file.  The command
+@example
+@code{C-x C-f @var{filename}}
+@end example
+is equivalent to typing
+@example
+@code{g(@var{filename})*}
+@end example
+
+@item @code{C-x C-b} (@code{list-visited-nodes})
+@kindex C-x C-b
+@findex list-visited-nodes
+Make a window containing a menu of all of the currently visited nodes.
+This window becomes the selected window, and you may use the standard
+Info commands within it.
+
+@item @code{C-x b} (@code{select-visited-node})
+@kindex C-x b
+@findex select-visited-node
+Select a node which has been previously visited in a visible window.
+This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is
+created.
+@end table
+
+@node Searching Commands, Xref Commands, Node Commands, Top
+@chapter Searching an Info File
+@cindex searching
+
+GNU Info allows you to search for a sequence of characters throughout an
+entire Info file, search through the indices of an Info file, or find
+areas within an Info file which discuss a particular topic.
+
+@table @asis
+@item @code{s} (@code{search})
+@kindex s
+@findex search
+Read a string in the echo area and search for it.
+
+@item @code{C-s} (@code{isearch-forward})
+@kindex C-s
+@findex isearch-forward
+Interactively search forward through the Info file for a string as you
+type it.
+
+@item @code{C-r} (@code{isearch-backward})
+@kindex C-r
+@findex isearch-backward
+Interactively search backward through the Info file for a string as
+you type it.
+
+@item @code{i} (@code{index-search})
+@kindex i
+@findex index-search
+Look up a string in the indices for this Info file, and select a node
+where the found index entry points to.
+
+@item @code{,} (@code{next-index-match})
+@kindex ,
+@findex next-index-match
+Move to the node containing the next matching index item from the last
+@samp{i} command.
+@end table
+
+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
+@samp{s} commands show you the default search string within @samp{[} and
+@samp{]}; pressing @key{RET} instead of typing a new string will use the
+default search string.
+
+@dfn{Incremental searching} is similar to basic searching, but the
+string is looked up while you are typing it, instead of waiting until
+the entire search string has been specified.
+
+@node Xref Commands, Window Commands, Searching Commands, Top
+@chapter Selecting Cross References
+
+We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up}
+pointers which appear at the top of a node.  In addition to these
+pointers, a node may contain other pointers which refer you to a
+different node, perhaps in another Info file.  Such pointers are called
+@dfn{cross references}, or @dfn{xrefs} for short.
+
+@menu
+* Parts of an Xref::            What a cross reference is made of.
+* Selecting Xrefs::             Commands for selecting menu or note items.
+@end menu
+
+@node Parts of an Xref, Selecting Xrefs,  , Xref Commands
+@section Parts of an Xref
+
+Cross references have two major parts: the first part is called the
+@dfn{label}; it is the name that you can use to refer to the cross
+reference, and the second is the @dfn{target}; it is the full name of
+the node that the cross reference points to.
+
+The target is separated from the label by a colon @samp{:}; first the
+label appears, and then the target.  For example, in the sample menu
+cross reference below, the single colon separates the label from the
+target.
+
+@example
+* Foo Label: Foo Target.        More information about Foo.
+@end example
+
+Note the @samp{.} which ends the name of the target.  The @samp{.} is
+not part of the target; it serves only to let Info know where the target
+name ends.
+
+A shorthand way of specifying references allows two adjacent colons to
+stand for a target name which is the same as the label name:
+
+@example
+* Foo Commands::                Commands pertaining to Foo.
+@end example
+
+In the above example, the name of the target is the same as the name of
+the label, in this case @code{Foo Commands}.
+
+You will normally see two types of cross reference while viewing nodes:
+@dfn{menu} references, and @dfn{note} references.  Menu references
+appear within a node's menu; they begin with a @samp{*} at the beginning
+of a line, and continue with a label, a target, and a comment which
+describes what the contents of the node pointed to contains.
+
+Note references appear within the body of the node text; they begin with
+@code{*Note}, and continue with a label and a target.
+
+Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references
+can point to any valid node.  They are used to refer you to a place
+where more detailed information can be found on a particular subject.
+Here is a cross reference which points to a node within the Texinfo
+documentation:  @xref{xref, , Writing an Xref, texinfo, the Texinfo
+Manual}, for more information on creating your own texinfo cross
+references.
+
+@node Selecting Xrefs,  , Parts of an Xref, Xref Commands
+@section Selecting Xrefs
+
+The following table lists the Info commands which operate on menu items.
+
+@table @asis
+@item @code{1} (@code{menu-digit})
+@itemx @code{2} @dots{} @code{9}
+@cindex 1 @dots{} 9, in Info windows
+@kindex 1 @dots{} 9, in Info windows
+@findex menu-digit
+Within an Info window, pressing a single digit, (such as @samp{1}),
+selects that menu item, and places its node in the current window.
+For convenience, there is one exception; pressing @samp{0} selects the
+@emph{last} item in the node's menu.
+
+@item @code{0} (@code{last-menu-item})
+@kindex 0, in Info windows
+@findex last-menu-item
+Select the last item in the current node's menu.
+
+@item @code{m} (@code{menu-item})
+@kindex m
+@findex menu-item
+Reads the name of a menu item in the echo area and selects its node.
+Completion is available while reading the menu label.
+
+@item @code{M-x find-menu}
+@findex find-menu
+Move the cursor to the start of this node's menu.
+@end table
+
+This table lists the Info commands which operate on note cross references.
+
+@table @asis
+@item @code{f} (@code{xref-item})
+@itemx @code{r}
+@kindex f
+@kindex r
+@findex xref-item
+Reads the name of a note cross reference in the echo area and selects
+its node.  Completion is available while reading the cross reference
+label.
+@end table
+
+Finally, the next few commands operate on menu or note references alike:
+
+@table @asis
+@item @code{TAB} (@code{move-to-next-xref})
+@kindex TAB, in Info windows
+@findex move-to-next-xref
+Move the cursor to the start of the next nearest menu item or note
+reference in this node.  You can then use @key{RET}
+(@code{select-reference-this-line}) to select the menu or note reference.
+
+@item @code{M-TAB} (@code{move-to-prev-xref})
+@kindex M-TAB, in Info windows
+@findex move-to-prev-xref
+Move the cursor the start of the nearest previous menu item or note
+reference in this node.
+
+@item @code{RET} (@code{select-reference-this-line})
+@kindex RET, in Info windows
+@findex select-reference-this-line
+Select the menu item or note reference appearing on this line.
+@end table
+
+@node Window Commands, Printing Nodes, Xref Commands, Top
+@chapter Manipulating Multiple Windows
+@cindex windows, manipulating
+
+A @dfn{window} is a place to show the text of a node.  Windows have a
+view area where the text of the node is displayed, and an associated
+@dfn{mode line}, which briefly describes the node being viewed.
+
+GNU Info supports multiple windows appearing in a single screen; each
+window is separated from the next by its modeline.  At any time, there
+is only one @dfn{active} window, that is, the window in which the cursor
+appears.  There are commands available for creating windows, changing
+the size of windows, selecting which window is active, and for deleting
+windows.
+
+@menu
+* The Mode Line::               What appears in the mode line?
+* Basic Windows::               Manipulating windows in Info.
+* The Echo Area::               Used for displaying errors and reading input.
+@end menu
+
+@node The Mode Line, Basic Windows,  , Window Commands
+@section The Mode Line
+
+A @dfn{mode line} is a line of inverse video which appears at the bottom
+of an Info window.  It describes the contents of the window just above
+it; this information includes the name of the file and node appearing in
+that window, the number of screen lines it takes to display the node,
+and the percentage of text that is above the top of the window.  It can
+also tell you if the indirect tags table for this Info file needs to be
+updated, and whether or not the Info file was compressed when stored on
+disk.
+
+Here is a sample mode line for a window containing an uncompressed file
+named @file{dir}, showing the node @samp{Top}.
+
+@example
+@group
+-----Info: (dir)Top, 40 lines --Top---------------------------------------
+            ^^   ^   ^^^        ^^
+          (file)Node #lines    where
+@end group
+@end example
+
+When a node comes from a file which is compressed on disk, this is
+indicated in the mode line with two small @samp{z}'s.  In addition, if
+the Info file containing the node has been split into subfiles, the name
+of the subfile containing the node appears in the modeline as well:
+
+@example
+--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z---------------
+@end example 
+
+When Info makes a node internally, such that there is no corresponding
+info file on disk, the name of the node is surrounded by asterisks
+(@samp{*}).  The name itself tells you what the contents of the window
+are; the sample mode line below shows an internally constructed node
+showing possible completions:
+
+@example
+-----Info: *Completions*, 7 lines --All-----------------------------------
+@end example
+
+@node Basic Windows, The Echo Area, The Mode Line, Window Commands
+@section Window Commands
+
+It can be convenient to view more than one node at a time.  To allow
+this, Info can display more than one @dfn{window}.  Each window has its
+own mode line (@pxref{The Mode Line}) and history of nodes viewed in that
+window (@pxref{Node Commands, , @code{history-node}}).
+
+@table @asis
+@item @code{C-x o} (@code{next-window})
+@cindex windows, selecting
+@kindex C-x o
+@findex next-window
+Select the next window on the screen.  Note that the echo area can only be
+selected if it is already in use, and you have left it temporarily.
+Normally, @samp{C-x o} simply moves the cursor into the next window on
+the screen, or if you are already within the last window, into the first
+window on the screen.  Given a numeric argument, @samp{C-x o} moves over
+that many windows.  A negative argument causes @samp{C-x o} to select
+the previous window on the screen.
+
+@item @code{M-x prev-window}
+@findex prev-window
+Select the previous window on the screen.  This is identical to
+@samp{C-x o} with a negative argument.
+
+@item @code{C-x 2} (@code{split-window})
+@cindex windows, creating
+@kindex C-x 2
+@findex split-window
+Split the current window into two windows, both showing the same node.
+Each window is one half the size of the original window, and the cursor
+remains in the original window.  The variable @code{automatic-tiling}
+can cause all of the windows on the screen to be resized for you
+automatically, please @pxref{Variables, , automatic-tiling} for more
+information.
+
+@item @code{C-x 0} (@code{delete-window})
+@cindex windows, deleting
+@kindex C-x 0
+@findex delete-window
+Delete the current window from the screen.  If you have made too many
+windows and your screen appears cluttered, this is the way to get rid of
+some of them.
+
+@item @code{C-x 1} (@code{keep-one-window})
+@kindex C-x 1
+@findex keep-one-window
+Delete all of the windows excepting the current one.
+
+@item @code{ESC C-v} (@code{scroll-other-window})
+@kindex ESC C-v, in Info windows
+@findex scroll-other-window
+Scroll the other window, in the same fashion that @samp{C-v} might
+scroll the current window.  Given a negative argument, scroll the
+"other" window backward.
+
+@item @code{C-x ^} (@code{grow-window})
+@kindex C-x ^
+@findex grow-window
+Grow (or shrink) the current window.  Given a numeric argument, grow
+the current window that many lines; with a negative numeric argument,
+shrink the window instead.
+
+@item @code{C-x t} (@code{tile-windows})
+@cindex tiling
+@kindex C-x t
+@findex tile-windows
+Divide the available screen space among all of the visible windows.
+Each window is given an equal portion of the screen in which to display
+its contents.  The variable @code{automatic-tiling} can cause
+@code{tile-windows} to be called when a window is created or deleted.
+@xref{Variables, , @code{automatic-tiling}}.
+@end table
+
+@node The Echo Area,  , Basic Windows, Window Commands
+@section The Echo Area
+@cindex echo area
+
+The @dfn{echo area} is a one line window which appears at the bottom of
+the screen.  It is used to display informative or error messages, and to
+read lines of input from you when that is necessary.  Almost all of the
+commands available in the echo area are identical to their Emacs
+counterparts, so please refer to that documentation for greater depth of
+discussion on the concepts of editing a line of text.  The following
+table briefly lists the commands that are available while input is being
+read in the echo area:
+
+@table @asis
+@item @code{C-f} (@code{echo-area-forward})
+@kindex C-f, in the echo area
+@findex echo-area-forward
+Move forward a character.
+
+@item @code{C-b} (@code{echo-area-backward})
+@kindex C-b, in the echo area
+@findex echo-area-backward
+Move backward a character.
+
+@item @code{C-a} (@code{echo-area-beg-of-line})
+@kindex C-a, in the echo area
+@findex echo-area-beg-of-line
+Move to the start of the input line.
+
+@item @code{C-e} (@code{echo-area-end-of-line})
+@kindex C-e, in the echo area
+@findex echo-area-end-of-line
+Move to the end of the input line.
+
+@item @code{M-f} (@code{echo-area-forward-word})
+@kindex M-f, in the echo area
+@findex echo-area-forward-word
+Move forward a word.
+
+@item @code{M-b} (@code{echo-area-backward-word})
+@kindex M-b, in the echo area
+@findex echo-area-backward-word
+Move backward a word.
+
+@item @code{C-d} (@code{echo-area-delete})
+@kindex C-d, in the echo area
+@findex echo-area-delete
+Delete the character under the cursor.
+
+@item @code{DEL} (@code{echo-area-rubout})
+@kindex DEL, in the echo area
+@findex echo-area-rubout
+Delete the character behind the cursor.
+
+@item @code{C-g} (@code{echo-area-abort})
+@kindex C-g, in the echo area
+@findex echo-area-abort
+Cancel or quit the current operation.  If completion is being read,
+@samp{C-g} discards the text of the input line which does not match any
+completion.  If the input line is empty, @samp{C-g} aborts the calling
+function.
+
+@item @code{RET} (@code{echo-area-newline})
+@kindex RET, in the echo area
+@findex echo-area-newline
+Accept (or forces completion of) the current input line.
+
+@item @code{C-q} (@code{echo-area-quoted-insert})
+@kindex C-q, in the echo area
+@findex echo-area-quoted-insert
+Insert the next character verbatim.  This is how you can insert control
+characters into a search string, for example.
+
+@item @var{printing character} (@code{echo-area-insert})
+@kindex printing characters, in the echo area
+@findex echo-area-insert
+Insert the character.
+
+@item @code{M-TAB} (@code{echo-area-tab-insert})
+@kindex M-TAB, in the echo area
+@findex echo-area-tab-insert
+Insert a TAB character.
+
+@item @code{C-t} (@code{echo-area-transpose-chars})
+@kindex C-t, in the echo area
+@findex echo-area-transpose-chars
+Transpose the characters at the cursor.
+@end table
+
+The next group of commands deal with @dfn{killing}, and @dfn{yanking}
+text.  For an in depth discussion of killing and yanking,
+@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual}
+
+@table @asis
+@item @code{M-d} (@code{echo-area-kill-word})
+@kindex M-d, in the echo area
+@findex echo-area-kill-word
+Kill the word following the cursor.
+
+@item @code{M-DEL} (@code{echo-area-backward-kill-word})
+@kindex M-DEL, in the echo area
+@findex echo-area-backward-kill-word
+Kill the word preceding the cursor.
+
+@item @code{C-k} (@code{echo-area-kill-line})
+@kindex C-k, in the echo area
+@findex echo-area-kill-line
+Kill the text from the cursor to the end of the line.
+
+@item @code{C-x DEL} (@code{echo-area-backward-kill-line})
+@kindex C-x DEL, in the echo area
+@findex echo-area-backward-kill-line
+Kill the text from the cursor to the beginning of the line.
+
+@item @code{C-y} (@code{echo-area-yank})
+@kindex C-y, in the echo area
+@findex echo-area-yank
+Yank back the contents of the last kill.
+
+@item @code{M-y} (@code{echo-area-yank-pop})
+@kindex M-y, in the echo area
+@findex echo-area-yank-pop
+Yank back a previous kill, removing the last yanked text first.
+@end table
+
+Sometimes when reading input in the echo area, the command that needed
+input will only accept one of a list of several choices.  The choices
+represent the @dfn{possible completions}, and you must respond with one
+of them.  Since there are a limited number of responses you can make,
+Info allows you to abbreviate what you type, only typing as much of the
+response as is necessary to uniquely identify it.  In addition, you can
+request Info to fill in as much of the response as is possible; this
+is called @dfn{completion}.
+
+The following commands are available when completing in the echo area:
+
+@table @asis
+@item @code{TAB} (@code{echo-area-complete})
+@itemx @code{SPC}
+@kindex TAB, in the echo area
+@kindex SPC, in the echo area
+@findex echo-area-complete
+Insert as much of a completion as is possible.
+
+@item @code{?} (@code{echo-area-possible-completions})
+@kindex ?, in the echo area
+@findex echo-area-possible-completions
+Display a window containing a list of the possible completions of what
+you have typed so far.  For example, if the available choices are:
+
+@example
+@group
+bar
+foliate
+food
+forget
+@end group
+@end example
+
+@noindent
+and you have typed an @samp{f}, followed by @samp{?}, the possible
+completions would contain:
+
+@example
+@group
+foliate
+food
+forget
+@end group
+@end example
+
+@noindent
+i.e., all of the choices which begin with @samp{f}.  Pressing @key{SPC}
+or @key{TAB} would result in @samp{fo} appearing in the echo area, since
+all of the choices which begin with @samp{f} continue with @samp{o}.
+Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate}
+appearing in the echo area, since that is the only choice which begins
+with @samp{fol}.
+
+@item @code{ESC C-v} (@code{echo-area-scroll-completions-window})
+@kindex ESC C-v, in the echo area
+@findex echo-area-scroll-completions-window
+Scroll the completions window, if that is visible, or the "other"
+window if not.
+@end table
+
+@node Printing Nodes, Miscellaneous Commands, Window Commands, Top
+@chapter Printing Out Nodes
+@cindex printing
+
+You may wish to print out the contents of a node as  a quick reference
+document for later use.  Info provides you with a command for doing
+this.  In general, we recommend that you use @TeX{} to format the
+document and print sections of it, by running @code{tex} on the Texinfo
+source file.
+
+@table @asis
+@item @code{M-x print-node}
+@findex print-node
+@cindex INFO_PRINT_COMMAND, environment variable
+Pipe the contents of the current node through the command in the
+environment variable @code{INFO_PRINT_COMMAND}.  If the variable does not
+exist, the node is simply piped to @code{lpr}.
+@end table
+
+@node Miscellaneous Commands, Variables, Printing Nodes, Top
+@chapter Miscellaneous Commands
+
+GNU Info contains several commands which self-document GNU Info:
+
+@table @asis
+@item @code{M-x describe-command}
+@cindex functions, describing
+@cindex commands, describing
+@findex describe-command
+Read the name of an Info command in the echo area and then display a
+brief description of what that command does.
+
+@item @code{M-x describe-key}
+@cindex keys, describing
+@findex describe-key
+Read a key sequence in the echo area, and then display the name and
+documentation of the Info command that the key sequence invokes.
+
+@item @code{M-x describe-variable}
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+
+@item @code{M-x where-is}
+@findex where-is
+Read the name of an Info command in the echo area, and then display
+a key sequence which can be typed in order to invoke that command.
+
+@item @code{C-h} (@code{get-help-window})
+@itemx @code{?}
+@kindex C-h
+@kindex ?, in Info windows
+@findex get-help-window
+Create (or Move into) the window displaying @code{*Help*}, and place
+a node containing a quick reference card into it.  This window displays
+the most concise information about GNU Info available.
+
+@item @code{h} (@code{get-info-help-node})
+@kindex h
+@findex get-info-help-node
+Try hard to visit the node @code{(info)Help}.  The Info file
+@file{info.texi} distributed with GNU Info contains this node.  Of
+course, the file must first be processed with @code{makeinfo}, and then
+placed into the location of your Info directory.
+@end table
+
+Here are the commands for creating a numeric argument:
+
+@table @asis
+@item @code{C-u} (@code{universal-argument})
+@cindex numeric arguments
+@kindex C-u
+@findex universal-argument
+Start (or multiply by 4) the current numeric argument.  @samp{C-u} is
+a good way to give a small numeric argument to cursor movement or
+scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while
+@samp{C-u C-u C-n} moves the cursor down 16 lines.
+
+@item @code{M-1} (@code{add-digit-to-numeric-arg})
+@itemx @code{M-2} @dots{} @code{M-9}
+@kindex M-1 @dots{} M-9
+@findex add-digit-to-numeric-arg
+Add the digit value of the invoking key to the current numeric
+argument.  Once Info is reading a numeric argument, you may just type
+the digits of the argument, without the Meta prefix.  For example, you
+might give @samp{C-l} a numeric argument of 32 by typing:
+
+@example
+@kbd{C-u 3 2 C-l}
+@end example
+
+@noindent
+or
+
+@example
+@kbd{M-3 2 C-l}
+@end example
+@end table
+
+@samp{C-g} is used to abort the reading of a multi-character key
+sequence, to cancel lengthy operations (such as multi-file searches) and
+to cancel reading input in the echo area.
+
+@table @asis
+@item @code{C-g} (@code{abort-key})
+@cindex cancelling typeahead
+@cindex cancelling the current operation
+@kindex C-g, in Info windows
+@findex abort-key
+Cancel current operation.
+@end table
+
+The @samp{q} command of Info simply quits running Info.
+
+@table @asis
+@item @code{q} (@code{quit})
+@cindex quitting
+@kindex q
+@findex quit
+Exit GNU Info.
+@end table
+
+If the operating system tells GNU Info that the screen is 60 lines tall,
+and it is actually only 40 lines tall, here is a way to tell Info that
+the operating system is correct.
+
+@table @asis
+@item @code{M-x set-screen-height}
+@findex set-screen-height
+@cindex screen, changing the height of
+Read a height value in the echo area and set the height of the
+displayed screen to that value.
+@end table
+
+Finally, Info provides a convenient way to display footnotes which might
+be associated with the current node that you are viewing:
+
+@table @asis
+@item @code{ESC C-f} (@code{show-footnotes})
+@kindex ESC C-f
+@findex show-footnotes
+@cindex footnotes, displaying
+Show the footnotes (if any) associated with the current node in another
+window.  You can have Info automatically display the footnotes
+associated with a node when the node is selected by setting the variable
+@code{automatic-footnotes}.  @xref{Variables, , @code{automatic-footnotes}}.
+@end table
+
+@node Variables, GNU Info Global Index, Miscellaneous Commands, Top
+@chapter Manipulating Variables
+
+GNU Info contains several @dfn{variables} whose values are looked at by
+various Info commands.  You can change the values of these variables,
+and thus change the behavior of Info to more closely match your
+environment and Info file reading manner.
+
+@table @asis
+@item @code{M-x set-variable}
+@cindex variables, setting
+@findex set-variable
+Read the name of a variable, and the value for it, in the echo area and
+then set the variable to that value.  Completion is available when
+reading the variable name; often, completion is available when reading
+the value to give to the variable, but that depends on the variable
+itself.  If a variable does @emph{not} supply multiple choices to
+complete over, it expects a numeric value.
+
+@item @code{M-x describe-variable}
+@cindex variables, describing
+@findex describe-variable
+Read the name of a variable in the echo area and then display a brief
+description of what the variable affects.
+@end table
+
+Here is a list of the variables that you can set in Info.
+
+@table @code
+@item automatic-footnotes
+@vindex automatic-footnotes
+When set to @code{On}, footnotes appear and disappear automatically.
+This variable is @code{On} by default.  When a node is selected, a
+window containing the footnotes which appear in that node is created,
+and the footnotes are displayed within the new window.  The window that
+Info creates to contain the footnotes is called @samp{*Footnotes*}.  If
+a node is selected which contains no footnotes, and a @samp{*Footnotes*}
+window is on the screen, the @samp{*Footnotes*} window is deleted.
+Footnote windows created in this fashion are not automatically tiled so
+that they can use as little of the display as is possible.
+
+@item automatic-tiling
+@vindex automatic-tiling
+When set to @code{On}, creating or deleting a window resizes other
+windows.  This variable is @code{Off} by default.  Normally, typing
+@samp{C-x 2} divides the current window into two equal parts.  When
+@code{automatic-tiling} is set to @code{On}, all of the windows are
+resized automatically, keeping an equal number of lines visible in each
+window.  There are exceptions to the automatic tiling; specifically, the
+windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not}
+resized through automatic tiling; they remain their original size.
+
+@item visible-bell
+@vindex visible-bell
+When set to @code{On}, GNU Info attempts to flash the screen instead of
+ringing the bell.  This variable is @code{Off} by default.  Of course,
+Info can only flash the screen if the terminal allows it; in the case
+that the terminal does not allow it, the setting of this variable has no
+effect.  However, you can make Info perform quietly by setting the
+@code{errors-ring-bell} variable to @code{Off}.
+
+@item errors-ring-bell
+@vindex errors-ring-bell
+When set to @code{On}, errors cause the bell to ring.  The default
+setting of this variable is @code{On}.
+
+@item gc-compressed-files
+@vindex gc-compressed-files
+When set to @code{On}, Info garbage collects files which had to be
+uncompressed.  The default value of this variable is @code{Off}.
+Whenever a node is visited in Info, the Info file containing that node
+is read into core, and Info reads information about the tags and nodes
+contained in that file.  Once the tags information is read by Info, it
+is never forgotten.  However, the actual text of the nodes does not need
+to remain in core unless a particular Info window needs it.  For
+non-compressed files, the text of the nodes does not remain in core when
+it is no longer in use.  But de-compressing a file can be a time
+consuming operation, and so Info tries hard not to do it twice.
+@code{gc-compressed-files} tells Info it is okay to garbage collect the
+text of the nodes of a file which was compressed on disk.
+
+@item show-index-match
+@vindex show-index-match
+When set to @code{On}, the portion of the matched search string is
+highlighted in the message which explains where the matched search
+string was found.  The default value of this variable is @code{On}.
+When Info displays the location where an index match was found,
+(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the
+string that you had typed is highlighted by displaying it in the inverse
+case from its surrounding characters.
+
+@item scroll-behavior
+@vindex scroll-behavior
+Control what happens when forward scrolling is requested at the end of
+a node, or when backward scrolling is requested at the beginning of a
+node.  The default value for this variable is @code{Continuous}.  There
+are three possible values for this variable:
+
+@table @code
+@item Continuous
+Try to get the first item in this node's menu, or failing that, the
+@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}.
+This behavior is identical to using the @samp{]}
+(@code{global-next-node}) and @samp{[} (@code{global-prev-node})
+commands.
+
+@item Next Only
+Only try to get the @samp{Next} node.
+
+@item Page Only
+Simply give up, changing nothing.  If @code{scroll-behavior} is
+@code{Page Only}, no scrolling command can change the node that is being
+viewed.
+@end table
+
+@item scroll-step
+@vindex scroll-step
+The number of lines to scroll when the cursor moves out of the window.
+Scrolling happens automatically if the cursor has moved out of the
+visible portion of the node text when it is time to display.  Usually
+the scrolling is done so as to put the cursor on the center line of the
+current window.  However, if the variable @code{scroll-step} has a
+nonzero value, Info attempts to scroll the node text by that many lines;
+if that is enough to bring the cursor back into the window, that is what
+is done.  The default value of this variable is 0, thus placing the
+cursor (and the text it is attached to) in the center of the window.
+Setting this variable to 1 causes a kind of "smooth scrolling" which
+some people prefer.
+
+@item ISO-Latin
+@cindex ISO Latin characters
+@vindex ISO-Latin
+When set to @code{On}, Info accepts and displays ISO Latin characters.
+By default, Info assumes an ASCII character set.  @code{ISO-Latin} tells
+Info that it is running in an environment where the European standard
+character set is in use, and allows you to input such characters to
+Info, as well as display them.
+@end table
+
+
+
+@c the following is incomplete
+@ignore
+@c node Info for Sys Admins
+@c 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
+GNU Info on the system; although users may find the information present
+in this section interesting, none of it is vital to understanding how to
+use GNU Info.
+
+@menu
+* 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
+
+@c node Setting the INFOPATH
+@c section Setting the INFOPATH
+
+Where are my Info files kept?
+
+@c node Editing the DIR node
+@c section Editing the DIR node
+
+What goes in `DIR', and why?
+
+@c node Storing Info files
+@c section Storing Info files
+
+Alternate formats allow flexibility in setups.
+
+@c node Using `localdir'
+@c section Using `localdir'
+
+Building DIR on the fly.
+
+@c node Example setups
+@c section Example setups
+
+Some common ways to organize Info files.
+@end ignore
+
+@node GNU Info Global Index,  , Variables, Top
+@appendix Global Index
+
+@printindex cp
+
+@contents
+@bye
diff --git a/man/internals/Makefile b/man/internals/Makefile
new file mode 100644 (file)
index 0000000..9229d29
--- /dev/null
@@ -0,0 +1,70 @@
+# Makefile for the XEmacs Internals Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+VERSION=1.0
+NAME=internals
+manual = xemacs-internals-manual-19-$(VERSION)
+
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# Uncomment this line for permuted index.
+# permuted_index = 1 
+
+# List of all the texinfo files in the manual:
+
+srcs = internals.texi index.unperm index.perm
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs) index.texi
+       @echo "Expect a coredump if you are not using makeinfo 1.68 (or later)"
+       $(MAKEINFO) $(NAME).texi
+       @rm -f core
+
+dvi : $(NAME).dvi
+
+$(NAME).dvi: $(srcs) index.texi
+       # Avoid losing old contents of aux file entirely.
+       -mv $(NAME).aux $(NAME).oaux
+       # First shot to define xrefs:
+       $(TEX) $(NAME).texi
+       if [ a${permuted_index} != a ]; \
+       then ./permute-index && mv permuted.fns $(NAME).fns; \
+       else texindex $(NAME).??; \
+       fi
+       $(TEX) $(NAME).texi
+
+index.texi:
+       if [ a${permuted_index} != a ]; \
+       then ln -s index.perm   index.texi; \
+       else ln -s index.unperm index.texi; \
+       fi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+       rm -f *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+              *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+       rm -f *.dvi *.ps make.out core index.texi
+distclean:  clean
+realclean:  clean
+extraclean: clean
+       -rm -f *~ \#*
diff --git a/man/internals/index.perm b/man/internals/index.perm
new file mode 100644 (file)
index 0000000..0624e15
--- /dev/null
@@ -0,0 +1,37 @@
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted.  Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index,  , Interface to X Windows, Top
+@unnumbered Index
+
+
+All variables, functions, keys, programs, files, and concepts are
+in this one index.  
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name.  For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}.  Key entries are not permuted, however.
+
+
+@c Print the indices
+
+@printindex fn
diff --git a/man/internals/index.unperm b/man/internals/index.unperm
new file mode 100644 (file)
index 0000000..4a27571
--- /dev/null
@@ -0,0 +1,37 @@
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted.  Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index,  , Interface to X Windows, Top
+@unnumbered Index
+
+@ignore
+All variables, functions, keys, programs, files, and concepts are
+in this one index.  
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name.  For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}.  Key entries are not permuted, however.
+@end ignore
+
+@c Print the indices
+
+@printindex fn
diff --git a/man/lispref/Makefile b/man/lispref/Makefile
new file mode 100644 (file)
index 0000000..5ab9c87
--- /dev/null
@@ -0,0 +1,80 @@
+# Makefile for the  XEmacs Lisp Programmer's Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+VERSION=2.4
+NAME=lispref
+manual = elisp-manual-19-$(VERSION)
+
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# Uncomment this line for permuted index.
+# permuted_index = 1 
+
+# List of all the texinfo files in the manual:
+
+srcs = abbrevs.texi annotations.texi back.texi backups.texi buffers.texi \
+  building.texi commands.texi compile.texi consoles-devices.texi control.texi \
+  databases.texi debugging.texi dialog.texi display.texi edebug-inc.texi \
+  edebug.texi errors.texi eval.texi extents.texi faces.texi files.texi \
+  frames.texi functions.texi glyphs.texi hash-tables.texi help.texi \
+  hooks.texi index.texi internationalization.texi intro.texi \
+  keymaps.texi ldap.texi lispref.texi lists.texi loading.texi locals.texi \
+  macros.texi maps.texi markers.texi menus.texi minibuf.texi modes.texi \
+  mouse.texi mule.texi numbers.texi objects.texi os.texi positions.texi \
+  processes.texi range-tables.texi scrollbars.texi searching.texi \
+  sequences.texi specifiers.texi streams.texi strings.texi symbols.texi \
+  syntax.texi text.texi tips.texi toolbar.texi tooltalk.texi variables.texi \
+  windows.texi x-windows.texi index.unperm index.perm
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs) index.texi
+       $(MAKEINFO) -o $@ $(NAME).texi
+
+dvi: $(NAME).dvi
+
+$(NAME).dvi: $(srcs) index.texi
+       # Avoid losing old contents of aux file entirely.
+       -mv $(NAME).aux $(NAME).oaux
+       # First shot to define xrefs:
+       $(TEX) $(NAME).texi
+       if [ a${permuted_index} != a ]; \
+       then ./permute-index && mv permuted.fns $(NAME).fns; \
+       else texindex $(NAME).??; \
+       fi
+       $(TEX) $(NAME).texi
+
+index.texi:
+       if [ a${permuted_index} != a ]; \
+       then ln -s index.perm   index.texi; \
+       else ln -s index.unperm index.texi; \
+       fi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+       rm -f *.toc *.aux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+              *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+       rm -f *.dvi *.ps make.out core index.texi
+distclean: clean
+realclean: distclean
+extraclean: distclean
+       -rm -f *~ \#*
diff --git a/man/lispref/index.perm b/man/lispref/index.perm
new file mode 100644 (file)
index 0000000..163d218
--- /dev/null
@@ -0,0 +1,37 @@
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted.  Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index,  , Standard Hooks, Top
+@unnumbered Index
+
+
+All variables, functions, keys, programs, files, and concepts are
+in this one index.  
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name.  For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}.  Key entries are not permuted, however.
+
+
+@c Print the indices
+
+@printindex fn
diff --git a/man/lispref/index.unperm b/man/lispref/index.unperm
new file mode 100644 (file)
index 0000000..31ed313
--- /dev/null
@@ -0,0 +1,37 @@
+@c -*-texinfo-*-
+@setfilename ../../info/index.info
+
+@c Indexing guidelines
+
+@c I assume that all indexes will be combined.
+@c Therefore, if a generated findex and permutations
+@c cover the ways an index user would look up the entry,
+@c then no cindex is added.
+@c Concept index (cindex) entries will also be permuted.  Therefore, they
+@c have no commas and few irrelevant connectives in them.
+
+@c I tried to include words in a cindex that give the context of the entry,
+@c particularly if there is more than one entry for the same concept.
+@c For example, "nil in keymap"
+@c Similarly for explicit findex and vindex entries, e.g. "print example".
+
+@c Error codes are given cindex entries, e.g. "end-of-file error".
+
+@c pindex is used for .el files and Unix programs
+
+@node Index,  , Standard Hooks, Top
+@unnumbered Index
+
+@ignore
+All variables, functions, keys, programs, files, and concepts are
+in this one index.  
+
+All names and concepts are permuted, so they appear several times, one
+for each permutation of the parts of the name.  For example,
+@code{function-name} would appear as @b{function-name} and @b{name,
+function-}.  Key entries are not permuted, however.
+@end ignore
+
+@c Print the indices
+
+@printindex fn
diff --git a/man/lispref/permute-index b/man/lispref/permute-index
new file mode 100755 (executable)
index 0000000..600b066
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/csh -f
+# Generate a permuted index of all names.
+# The result is a file called index.fns.
+
+# You will need to modify this for your needs.
+
+
+set TEXINDEX=texindex  # path to texindex command
+#set EMACS=xemacs     # your emacs command
+#set TEX=tex             # your tex command
+
+set MANUAL=lispref  # the base name of the manual
+
+# goto 3
+
+1:
+echo "Extract raw index from texinfo fn index."
+# Let texindex combine duplicate entries, later.
+# But it wants to protect non-alphanumerics thus confusing ptx.
+# Also change `\ ' to just a ` ', since texindex will fail. This is produced 
+# by `@findex two words' in an example environment (no doubt among others).
+# delete wrapper parens
+# change dots {} to dots{}
+# change {-} to char form, so ptx wont ignore it.
+# delete leading \entry {
+# change '\ ' to ' '
+# change lines with = < > since they mess up field extraction.
+# separate into fields delimited by "
+cat ${MANUAL}.fn | \
+       sed \
+       -e 's/(\([^)]*\))/\1/' \
+       -e 's/\\dots {}/(\\dots{})/' \
+       -e "s/{-}/{{\\tt\\char'055}}/" \
+       -e 's,^[^ ]* {,,' \
+       -e 's, },},' \
+       -e 's,\\ , ,g' \
+       -e 's/{\\tt\\char61}/=/' \
+       -e 's/{\\tt\\gtr}/>/' \
+       -e 's/{\\tt\\less}/</' \
+       -e 's/}{/"/g' \
+       | awk -F\" '{print $2, $1}' >! permuted.raw
+
+2:
+# Build break file for ptx.
+cat <<EOF > permuted.break
+-
+:
+EOF
+# Build the ignore file for ptx.
+# We would like to ignore "and", "or", and "for", 
+# but ptx ignores ignore words even if they stand alone.
+cat <<EOF > permuted.ignore
+the
+in
+to
+as
+a
+an
+of
+on
+them
+how
+from
+by
+EOF
+
+echo "Make troff permuted index."
+ptx -i permuted.ignore -b permuted.break -f -r -w 144 \
+        < permuted.raw >! permuted.t
+
+3:
+echo "Extract the desired fields."
+awk -F\" '{printf "%s\"%s\"%s\n", $4,$6,$9}' permuted.t >! permuted.fields 
+
+4:
+echo "Format for texindex."
+# delete lines that start with "and ", "for "
+sed    < permuted.fields \
+       -e 's/=/{\\tt\\char61}/' \
+       -e 's/>/{\\tt\\gtr}/' \
+       -e 's/</{\\tt\\less}/' \
+       -e '/"and /d' \
+       -e '/"for /d' \
+  | awk -F\" 'NF>0 {if ($1=="") {\
+         print "\entry {" $2 "}{" 0+$3 "}{" $2 "}" }\
+       else {\
+         print "\entry {" $2 ", " $1 "}{" 0+$3 "}{" $2 ", " $1 "}"} }'\
+             > permuted.fn
+
+5:
+echo "Sort with texindex."
+${TEXINDEX} permuted.fn
+#mv permuted.fns ${MANUAL}.fns
+
+# The resulting permuted.fns will be read when we run TeX 
+# on the manual the second time.  Or you can use permuted.texinfo here.
+#${TEX} permuted.texinfo
+
+6:
+echo "Clean up."
+rm -f permuted.fields permuted.t permuted.raw
+rm -f permuted.break permuted.ignore permuted.fn
diff --git a/man/new-users-guide/Makefile b/man/new-users-guide/Makefile
new file mode 100644 (file)
index 0000000..3e24296
--- /dev/null
@@ -0,0 +1,51 @@
+# Makefile for the XEmacs New Users Guide
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+NAME=new-users-guide
+
+SHELL = /bin/sh
+TEXI2DVI = texi2dvi
+MAKEINFO = makeinfo
+
+# List of all the texinfo files in the manual:
+
+srcs = new-users-guide.texi custom1.texi files.texi region.texi \
+  custom2.texi help.texi search.texi edit.texi modes.texi \
+  xmenu.texi enter.texi
+
+all : info
+info : ../../info/$(NAME).info
+
+../../info/$(NAME).info: $(srcs)
+       $(MAKEINFO) -o $@ $(NAME).texi
+
+dvi : $(NAME).dvi
+.texi.dvi :
+       $(TEXI2DVI) $<
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+       rm -f *.toc *.aux *.oaux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+              *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+       rm -f *.dvi *.ps make.out core
+distclean:  clean
+realclean:  clean
+extraclean: clean
+       -rm -f *~ \#*
diff --git a/man/xemacs/Makefile b/man/xemacs/Makefile
new file mode 100644 (file)
index 0000000..24e9bd2
--- /dev/null
@@ -0,0 +1,56 @@
+# Makefile for the XEmacs Reference Manual.
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Modified by Ben Wing, February 1994
+
+NAME=xemacs
+
+MAKEINFO = makeinfo
+TEXI2DVI = texi2dvi
+
+# List of all the texinfo files in the manual:
+
+srcs = xemacs.texi abbrevs.texi basic.texi buffers.texi building.texi \
+  calendar.texi cmdargs.texi custom.texi display.texi entering.texi \
+  files.texi fixit.texi glossary.texi gnu.texi help.texi indent.texi \
+  keystrokes.texi killing.texi xemacs.texi m-x.texi major.texi mark.texi \
+  menus.texi mini.texi misc.texi mouse.texi new.texi picture.texi \
+  programs.texi reading.texi regs.texi frame.texi search.texi sending.texi \
+  text.texi trouble.texi undo.texi windows.texi
+
+all : info
+info : ../../info/$(NAME).info
+
+dvi: $(NAME).dvi
+.texi.dvi :
+       $(TEXI2DVI) $<
+
+../../info/$(NAME).info: $(srcs)
+       $(MAKEINFO) -o $@ $(NAME).texi
+
+.PHONY: mostlyclean clean distclean realclean extraclean
+mostlyclean:
+       rm -f *.toc *.aux *.oaux *.log *.cp *.cps *.fn *.fns *.tp *.tps \
+              *.vr *.vrs *.pg *.pgs *.ky *.kys
+clean: mostlyclean
+       rm -f *.dvi *.ps make.out core
+distclean: clean
+realclean: distclean
+extraclean: distclean
+       -rm -f *~ \#*
diff --git a/modules/Makefile.in b/modules/Makefile.in
new file mode 100644 (file)
index 0000000..07405d2
--- /dev/null
@@ -0,0 +1,19 @@
+@SET_MAKE@
+SUBDIR=ldap base64 zlib example
+RECURSIVE_MAKE=@RECURSIVE_MAKE@
+SHELL = /bin/sh
+RM = rm -f
+
+all:
+       -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+install clean mostlyclean:
+       -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+distclean:
+       $(RM) Makefile config.*
+       -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
+
+realclean extraclean:
+       $(RM) *~ \#*
+       -for d in $(SUBDIR) ; do (cd ./$${d} && $(RECURSIVE_MAKE) $@) ; done
diff --git a/modules/aclocal.m4 b/modules/aclocal.m4
new file mode 100644 (file)
index 0000000..1b1808d
--- /dev/null
@@ -0,0 +1,36 @@
+AC_DEFUN(XE_EMACS, [
+       dnl
+       dnl Apparently, if you run a shell window in Emacs, it sets the EMACS
+       dnl environment variable to 't'.  Lets undo the damage.
+       dnl
+       if test "${EMACS}" = "t"; then
+               EMACS=""
+       fi
+
+       AC_ARG_WITH(xemacs,           --with-xemacs             Use XEmacs to build, [ if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi ])
+       AC_ARG_WITH(emacs,            --with-emacs              Use Emacs to build, [ if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi ])
+       AC_CHECK_PROG(EMACS, xemacs, xemacs, emacs)
+       AC_SUBST(EMACS)
+])
+
+AC_DEFUN(XE_CONFIG_VALUE, [
+       OUTPUT=./conftest-$$
+       rm -f ${OUTPUT}
+       ${EMACS} -batch -eval "
+(let ((hash (config-value-hash-table))
+      (desired (split-string \"$1\")))
+  (mapcar
+     (lambda (key)
+       (message \"Checking for %S\" (intern key))
+       (if (config-value (intern key))
+          (progn
+           (write-region (format \"%s=\\\"%s\\\"\n\" key (config-value (intern key)))
+                         nil \"${OUTPUT}\" t))))
+       desired))
+" 2> /dev/null > /dev/null
+       test -f ${OUTPUT} && . ${OUTPUT}
+       rm -f ${OUTPUT}
+       for ac_func in $1; do
+                :
+       done
+])
diff --git a/modules/base64/Makefile.in b/modules/base64/Makefile.in
new file mode 100644 (file)
index 0000000..4170df4
--- /dev/null
@@ -0,0 +1,37 @@
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=base64
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+       $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+       echo "Don't know how to install yet"
+
+clean mostlyclean:
+       $(RM) *.o $(TARGET).ell
+
+distclean: clean
+       $(RM) Makefile
+
+realclean extraclean: distclean
+       $(RM) *~ \#*
diff --git a/modules/configure.in b/modules/configure.in
new file mode 100644 (file)
index 0000000..123fb37
--- /dev/null
@@ -0,0 +1,23 @@
+AC_PREREQ(2.12)
+AC_INIT(configure.in)
+
+XE_EMACS
+XE_CONFIG_VALUE(dll_cflags dll_ld dll_lflags dll_oflags CFLAGS CC DEFS INSTALL top_srcdir blddir)
+
+RM='rm -f'
+
+AC_SUBST(INSTALL)
+AC_SUBST(RM)
+AC_SUBST(CC)
+AC_SUBST(dll_cflags)
+AC_SUBST(dll_oflags)
+AC_SUBST(dll_lflags)
+AC_SUBST(dll_ld)
+AC_SUBST(top_srcdir)
+AC_SUBST(blddir)
+
+AC_OUTPUT(Makefile
+          ldap/Makefile
+          base64/Makefile
+         example/Makefile
+         zlib/Makefile)
diff --git a/modules/example/Makefile.in b/modules/example/Makefile.in
new file mode 100644 (file)
index 0000000..4cb432f
--- /dev/null
@@ -0,0 +1,35 @@
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=purified
+all: $(TARGET).ell
+
+.PHONY: clean mostlyclean distclean realclean install
+
+$(TARGET).ell: $(TARGET).o
+       $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+       echo "Don't know how to install yet"
+
+clean mostlyclean:
+       $(RM) *.o $(TARGET).ell
+
+distclean: clean
+       $(RM) Makefile
+
+realclean extraclean: distclean
+       $(RM) *~ \#*
diff --git a/modules/example/purified.c b/modules/example/purified.c
new file mode 100644 (file)
index 0000000..d66ad6c
--- /dev/null
@@ -0,0 +1,16 @@
+#include <config.h>
+#include "lisp.h"
+#include "emacsfns.h"
+
+DEFUN ("purifiedp", Fpurifiedp, 1, 1, 0, /*
+*/
+ (obj))
+{
+       return purified(obj) ? Qt : Qnil;
+}
+
+void
+syms_of()
+{
+       DEFSUBR(Fpurifiedp);
+}
diff --git a/modules/ldap/Makefile.in b/modules/ldap/Makefile.in
new file mode 100644 (file)
index 0000000..c35f80b
--- /dev/null
@@ -0,0 +1,37 @@
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=eldap
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+       $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+       echo "Don't know how to install yet"
+
+clean mostlyclean:
+       $(RM) *.o $(TARGET).ell
+
+distclean: clean
+       $(RM) Makefile
+
+realclean extraclean: distclean
+       $(RM) *~ \#*
diff --git a/modules/ldap/configure.in b/modules/ldap/configure.in
new file mode 100644 (file)
index 0000000..123fb37
--- /dev/null
@@ -0,0 +1,23 @@
+AC_PREREQ(2.12)
+AC_INIT(configure.in)
+
+XE_EMACS
+XE_CONFIG_VALUE(dll_cflags dll_ld dll_lflags dll_oflags CFLAGS CC DEFS INSTALL top_srcdir blddir)
+
+RM='rm -f'
+
+AC_SUBST(INSTALL)
+AC_SUBST(RM)
+AC_SUBST(CC)
+AC_SUBST(dll_cflags)
+AC_SUBST(dll_oflags)
+AC_SUBST(dll_lflags)
+AC_SUBST(dll_ld)
+AC_SUBST(top_srcdir)
+AC_SUBST(blddir)
+
+AC_OUTPUT(Makefile
+          ldap/Makefile
+          base64/Makefile
+         example/Makefile
+         zlib/Makefile)
diff --git a/modules/zlib/Makefile.in b/modules/zlib/Makefile.in
new file mode 100644 (file)
index 0000000..5b86a45
--- /dev/null
@@ -0,0 +1,37 @@
+# NOTE!!
+# The use of BLDDIR here is _BOGUS_.
+# What really needs to happen is that we should install config.h into
+# the architecture dependent directory when we really hash all this
+# out.
+
+blddir=@blddir@
+dll_cflags=@dll_cflags@
+dll_oflags=@dll_oflags@
+dll_lflags=@dll_lflags@
+dll_ld=@dll_ld@
+
+INCLUDES=-I$(blddir)/src
+CFLAGS=@CFLAGS@ $(INCLUDES)
+CC=@CC@
+RM=@RM@
+
+TARGET=zlib
+
+.PHONY: clean mostlyclean distclean realclean install
+
+all: $(TARGET).ell
+
+$(TARGET).ell: $(TARGET).o
+       $(dll_ld) $(dll_oflags) $@ $(dll_lflags) $^
+
+install:
+       echo "Don't know how to install yet"
+
+clean mostlyclean:
+       $(RM) *.o $(TARGET).ell
+
+distclean: clean
+       $(RM) Makefile
+
+realclean extraclean: distclean
+       $(RM) *~ \#*
diff --git a/nt/Makefile.cygwin b/nt/Makefile.cygwin
new file mode 100644 (file)
index 0000000..fdbd61e
--- /dev/null
@@ -0,0 +1,15 @@
+MSW_LIBS       =-luser32 -lgdi32 -lcomdlg32
+LDFLAGS                =-Wl,--subsystem,windows
+CFLAGS         =-g
+
+bindir         =/usr/local/bin
+
+INSTALL = /usr/local/src/xemacs-21.0-b42/lib-src/installexe.sh /d/cygnus/h-i386-cygwin32/bin/install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+
+runemacs.exe:  runemacs.o
+               $(CC) $(LDFLAGS) runemacs.o $(MSW_LIBS) -o $@
+
+install:       runemacs.exe
+               $(INSTALL_PROGRAM) runemacs.exe $(bindir)
diff --git a/nt/Todo b/nt/Todo
new file mode 100644 (file)
index 0000000..ac91718
--- /dev/null
+++ b/nt/Todo
@@ -0,0 +1,42 @@
+# List of problems with XEmacs. If anyone wants to work on these, please
+# mail me and I'll update the table below.
+
+# Core NT issues
+    1. Subprocess support is completely broken. 
+    2. Networking support is completely broken. This is due to the fact that
+       the model relies on the subprocess support also working. 
+    4. No binary release. We know a binary release would be A Good Thing.
+       However we want to make things stable before producing one so we don't
+       have to field too many problems. Sorry. 
+    5. Support for dired is perhaps not quite there. We need to port ls-lisp.el
+       from FSF Emacs. 
+    6. Currently the backup files do not get the same permissions as the file
+       being edited. August Hill is looking at this one. 
+    7. Verify that CRLF issues are dealt with correctly. Marc Paquette is
+       looking at this. 
+    8. Use the registry to store the root directory(ies) of lisp packages; that
+       is the path name, not the elisp files.
+
+# X issues
+    1. Redrawing on my (davidh) system seems fairly broken - I don't know if
+       this is the XEmacs redraw functionality, my X server or just something
+       strange with X under NT. Has anyone else experiences with this ?
+
+# Native GUI issues
+    0. The entire event model.
+    1. Calling mouse_[enter|leave]_frame_hook
+    2. Can't change bold, italic or bold-italic face fonts
+    3. Bogus delay when setting default- or initial-frame-plist
+    4. Short timeouts don't seem to be very accurate
+    5. Scrollbar dragging.  Redisplay isn't called while dragging.
+       Also can't retrieve 32 bit tracking position with GetScrollInfo()
+    6. Menubar
+    7. Palette handling
+    8. Middle mouse button emulation
+    9. Drag'n'drop
+   10. Images
+
+Old Issues. 
+
+    1. For some reason, HOME is a required environment variable. 
+
diff --git a/nt/inc/arpa/inet.h b/nt/inc/arpa/inet.h
new file mode 100644 (file)
index 0000000..f5d197c
--- /dev/null
@@ -0,0 +1 @@
+/* null version of <arpa/inet.h> - <sys/socket.h> has everything */
diff --git a/nt/inc/netdb.h b/nt/inc/netdb.h
new file mode 100644 (file)
index 0000000..5bf232e
--- /dev/null
@@ -0,0 +1 @@
+/* null version of <netdb.h> - <sys/socket.h> has everything */
diff --git a/nt/inc/netinet/in.h b/nt/inc/netinet/in.h
new file mode 100644 (file)
index 0000000..46fb0fa
--- /dev/null
@@ -0,0 +1 @@
+/* null version of <netinet/in.h> - <sys/socket.h> has everything */
diff --git a/nt/inc/pwd.h b/nt/inc/pwd.h
new file mode 100644 (file)
index 0000000..6202ccd
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef _PWD_H_
+#define _PWD_H_
+/*
+ * pwd.h doesn't exist on NT, so we put together our own.
+ */
+
+struct passwd {
+    char *pw_name;
+    char *pw_passwd;
+    int   pw_uid;
+    int   pw_gid;
+    int   pw_quota;
+    char *pw_gecos;
+    char *pw_dir;
+    char *pw_shell;
+};
+
+#endif /* _PWD_H_ */
diff --git a/nt/inc/sys/dir.h b/nt/inc/sys/dir.h
new file mode 100644 (file)
index 0000000..df729d2
--- /dev/null
@@ -0,0 +1,75 @@
+/* This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.30. */
+
+/*
+       <dir.h> -- definitions for 4.2BSD-compatible directory access
+
+       last edit:      09-Jul-1983     D A Gwyn
+*/
+
+#ifdef VMS
+#ifndef FAB$C_BID
+#include <fab.h>
+#endif
+#ifndef NAM$C_BID
+#include <nam.h>
+#endif
+#ifndef RMS$_SUC
+#include <rmsdef.h>
+#endif
+#include "vms-dir.h"
+#endif /* VMS */
+
+#define DIRBLKSIZ      512             /* size of directory block */
+#ifdef VMS
+#define MAXNAMLEN      (DIR$S_NAME + 7) /* 80 plus room for version #.  */
+#define MAXFULLSPEC    NAM$C_MAXRSS /* Maximum full spec */
+#else
+#ifdef WINDOWSNT
+#define MAXNAMLEN      255
+#else  /* not WINDOWSNT */
+#define MAXNAMLEN      15              /* maximum filename length */
+#endif /* not WINDOWSNT */
+#endif /* VMS */
+       /* NOTE:  MAXNAMLEN must be one less than a multiple of 4 */
+
+struct direct                          /* data from readdir() */
+       {
+       long            d_ino;          /* inode number of entry */
+       unsigned short  d_reclen;       /* length of this record */
+       unsigned short  d_namlen;       /* length of string in d_name */
+       char            d_name[MAXNAMLEN+1];    /* name of file */
+       };
+
+typedef struct
+       {
+       int     dd_fd;                  /* file descriptor */
+       int     dd_loc;                 /* offset in block */
+       int     dd_size;                /* amount of valid data */
+       char    dd_buf[DIRBLKSIZ];      /* directory block */
+       }       DIR;                    /* stream data from opendir() */
+
+DIR *opendir (CONST char *filename);
+void closedir (DIR *dirp);
+struct direct *readdir (DIR *dirp);
+struct direct *readdirver (DIR *dirp);
+long telldir (DIR *dirp);
+void seekdir (DIR *dirp, long loc);
+
+#define rewinddir( dirp )      seekdir( dirp, 0L )
diff --git a/nt/inc/sys/file.h b/nt/inc/sys/file.h
new file mode 100644 (file)
index 0000000..8536d03
--- /dev/null
@@ -0,0 +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 --git a/nt/inc/sys/ioctl.h b/nt/inc/sys/ioctl.h
new file mode 100644 (file)
index 0000000..dc09578
--- /dev/null
@@ -0,0 +1,5 @@
+/*
+ * sys\ioctl.h doesn't exist on NT...rather than including it conditionally
+ * in many of the source files, we just extend the include path so that the
+ * compiler will pick this up empty header instead.
+ */
diff --git a/nt/inc/sys/param.h b/nt/inc/sys/param.h
new file mode 100644 (file)
index 0000000..397c5ff
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _PARAM_H_
+#define _PARAM_H_
+
+/*
+ * sys\param.h doesn't exist on NT, so we'll make one.
+ */
+
+#define NBPG 4096
+
+#endif /* _PARAM_H_ */
diff --git a/nt/inc/sys/socket.h b/nt/inc/sys/socket.h
new file mode 100644 (file)
index 0000000..03c6077
--- /dev/null
@@ -0,0 +1,86 @@
+/* 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
+
+#if 0 /* What's wrong with winsock.h version ? - kkm */
+/* 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
+#endif /* 0 */
+
+/* avoid duplicate definition of timeval */
+#ifdef HAVE_TIMEVAL
+#define timeval ws_timeval
+#endif
+
+#include <winsock.h>
+
+#if 0 /* What's wrong with winsock.h version ? - kkm */
+/* 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"
+#endif /* 0 */
+
+#ifdef HAVE_TIMEVAL
+#undef timeval
+#endif
+
+/* 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 --git a/nt/inc/sys/time.h b/nt/inc/sys/time.h
new file mode 100644 (file)
index 0000000..3bbdbe7
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * sys/time.h doesn't exist on NT
+ */
+
+#include <time.h>
+
+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 */
+  };
+
+#ifndef HAVE_X_WINDOWS
+/* X11R6 on NT provides the single parameter version of this command */
+void gettimeofday (struct timeval *, struct timezone *);
+#endif
+
+/* end of sys/time.h */
diff --git a/nt/inc/unistd.h b/nt/inc/unistd.h
new file mode 100644 (file)
index 0000000..c1caa77
--- /dev/null
@@ -0,0 +1 @@
+/* Fake unistd.h: config.h already provides most of the relevant things. */
diff --git a/nt/puresize-adjust.h b/nt/puresize-adjust.h
new file mode 100644 (file)
index 0000000..b10cdc8
--- /dev/null
@@ -0,0 +1,3 @@
+/*     Do not edit this file!
+       Automatically generated by XEmacs */
+# define PURESIZE_ADJUSTMENT (0)
diff --git a/nt/runemacs.c b/nt/runemacs.c
new file mode 100644 (file)
index 0000000..a516eec
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+  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.  */
+
+/*
+   You may want to define this if you want to be able to install updated
+   emacs binaries even when other users are using the current version.
+   The problem with some file servers (notably Novell) is that an open
+   file cannot be overwritten, deleted, or even renamed.  So if someone
+   is running emacs.exe already, you cannot install a newer version.
+   By defining CHOOSE_NEWEST_EXE, you can name your new emacs.exe
+   something else which matches "emacs*.exe", and runemacs will
+   automatically select the newest emacs executeable in the bin directory.
+   (So you'll probably be able to delete the old version some hours/days
+   later).
+*/
+
+/* #define CHOOSE_NEWEST_EXE */
+
+#define WIN32
+
+#include <windows.h>
+#include <string.h>
+#include <malloc.h>
+
+#if defined(__CYGWIN32__)
+#include <sys/types.h>
+#include <sys/stat.h>
+#endif
+
+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);
+
+#ifdef CHOOSE_NEWEST_EXE
+  {
+    /* Silly hack to allow new versions to be installed on
+       server even when current version is in use. */
+
+    char * best_name = alloca (MAX_PATH + 1);
+    FILETIME best_time = {0,0};
+    WIN32_FIND_DATA wfd;
+    HANDLE fh;
+    p = new_cmdline + strlen (new_cmdline);
+    strcpy (p, "\\xemacs*.exe ");
+    fh = FindFirstFile (new_cmdline, &wfd);
+    if (fh == INVALID_HANDLE_VALUE)
+      goto error;
+    do
+      {
+        if (wfd.ftLastWriteTime.dwHighDateTime > best_time.dwHighDateTime
+            || (wfd.ftLastWriteTime.dwHighDateTime == best_time.dwHighDateTime
+                && wfd.ftLastWriteTime.dwLowDateTime > best_time.dwLowDateTime))
+          {
+            best_time = wfd.ftLastWriteTime;
+            strcpy (best_name, wfd.cFileName);
+          }
+      }
+    while (FindNextFile (fh, &wfd));
+    FindClose (fh);
+    *p++ = '\\';
+    strcpy (p, best_name);
+    strcat (p, " ");
+  }
+#else
+#if defined(__CYGWIN32__)
+  {
+    struct stat stbuf;
+    char sym_link_name[MAX_PATH+1], real_name[MAX_PATH+1];
+    
+    strcpy(sym_link_name, new_cmdline);
+    strcat(sym_link_name, "\\xemacs");
+    if (lstat(sym_link_name, &stbuf) == 0)
+      {
+        if ((stbuf.st_mode & S_IFLNK) == S_IFLNK)
+          {
+           if (readlink(sym_link_name, real_name, sizeof(real_name)) == -1)
+              {
+                MessageBox (NULL, "Error reading symbolic link for xemacs",
+                            "Error", MB_ICONSTOP);
+                return 1;
+              }
+            else
+              {
+               strcat(new_cmdline, "\\");
+                strcat(new_cmdline, real_name);
+               strcat(new_cmdline, " ");
+             }
+          }
+        else
+          strcat(new_cmdline, "\\xemacs ");
+      }
+    else
+      {
+        MessageBox (NULL, "can't locate XEmacs executable",
+                    "Error", MB_ICONSTOP);
+       return 1;
+      }
+  }
+#else                                  
+  strcat (new_cmdline, "\\xemacs.exe ");
+#endif
+#endif
+
+  /* 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;
+      for (p = modname; *p; p++)
+       if (*p == '\\') *p = '/';
+      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 XEmacs.", "Error", MB_ICONSTOP);
+  return 1;
+}
index 35afafe..72e9ef4 100644 (file)
@@ -1,432 +1,3 @@
-1998-09-29  SL Baur  <steve@altair.xemacs.org>
-
-       * XEmacs 21.2-beta2 is released.
-
-1998-09-27  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * regex.c (re_match_2_internal): Add in code to reset lowest_active_reg
-       to prevent memory corruption in the case of jumping out of a series of
-       nested match patterns. This is a rather brute force approach, though.
-
-1998-09-02  Andy Piper  <andyp@parallax.co.uk>
-
-       * config.h.in: ditto.
-
-       * s/cygwin32.h: rearrange declarations to cope with cygwin
-       b20. Include cygwin32/version.h if it exists.
-
-1998-09-20  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * device-msw.c (mswindows_init_device): Call new
-         mswindows_enumerate_fonts() function in objects-msw.c instead
-         of font_enum_callback_1() to enumerate fonts.
-
-         font_enum_callback_1() and _2() moved to objects-msw.c. 
-
-       * faces.c (complex_vars_of_faces): Make the mswindows default 
-         face font fully specified and provide some fallbacks.
-
-       * objects-msw.c: font_enum_callback_1() and _2() moved here
-         from objects-msw.c. Obtain the enumerated font's character
-         sets by table lookup instead of using the locale-specific
-         string provided by Windows.
-
-         New public non-method mswindows_enumerate_fonts() that fills
-         in the supplied mswindows device's font list.
-
-         mswindows_initialize_font_instance: Use the supplied name
-         variable instead of f->name when signalling errors. Match font
-         weights and character sets using lookup tables which handle
-         spaces instead of by frobbing.
-
-1998-09-20  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * process-nt.c: Define an arbitrary limit, FRAGMENT_CODE_SIZE,
-         on the size of code fragments passed to run_in_other_process.
-
-         run_in_other_process(): Use FRAGMENT_CODE_SIZE to determine
-         the amount of memory to allocate in the other process.
-
-         Removed sigkill_code_end(), sigint_code_end() and
-         sig_enable_code_end() since they are now redundant.
-
-         send_signal() and enable_child_signals(): Don't try to work
-         out the end of the code fragments passed to 
-         run_in_other_process()
-
-1998-09-10  Kazuyuki IENAGA  <ienaga@jsys.co.jp>
-
-       * src/s/freebsd.h: Added __ELF__ and compiler/liker flags for
-       FreeBSD-current.
-
-       * src/unexelf.c: Partially synched with FSF's 20.3.
-
-1998-09-10  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (signal_after_change): Map across indirect buffers
-       here, and not in the upper-level functions.
-       (signal_first_change): Don't check for Armageddon.
-       (signal_before_change): Map across indirect buffers here.
-       (prepare_to_modify_buffer): ...and here.
-
-1998-09-09  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (signal_after_change): Add return value.
-       (buffer_insert_string_1): Use it.
-       (buffer_delete_range): Ditto.
-       (buffer_replace_char): Ditto.
-       (cancel_multiple_change): Map the indirect buffers.
-
-1998-09-06  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (init_buffer_text): Remove INDIRECT_P parameter.
-       (uninit_buffer_text): Ditto.
-
-       * buffer.c (Fmake_indirect_buffer): Implement stricter
-       error-checking.
-
-1998-09-04  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (change_function_restore): Reverse order of
-       function-call and assignment.
-       (first_change_hook_restore): Ditto.
-
-       * extents.c (mark_extent_auxiliary): Mark them.
-       (Fset_extent_property): Set them.
-       (Fextent_property): Get them.
-       (Fextent_properties): Ditto.
-       (vars_of_extents): Set their default.
-
-       * extents.h (struct extent_auxiliary): Add before_change_functions
-       and after_change_functions.
-
-       * insdel.c (signal_before_change): Use it.
-       (signal_after_change): Ditto.
-
-       * extents.c (report_extent_modification): New function.
-
-       * insdel.c (signal_before_change): Don't check for Armageddon.
-       (signal_after_change): Ditto.
-
-1998-09-11  Gunnar Evermann  <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
-       * redisplay.c (redisplay_window): make sure a new starting point
-       is chosen if it somehow got moved from the beginning of the line
-       -- this can happen because Fwiden was called recently.
-
-       * window.c (Fset_window_start): set start_at_line_beg correctly
-       (Fset_window_buffer): Ditto
-
-1998-09-06  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (init_buffer_text): Remove INDIRECT_P parameter.
-       (uninit_buffer_text): Ditto.
-
-       * buffer.c (Fmake_indirect_buffer): Implement stricter
-       error-checking.
-
-1998-05-14  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * emacs.c (main_1): Removed references to *vars_of_filelock.
-
-       * lisp.h: Added Fsystem_name.
-
-       * filelock.c: Replaced by version from FSF 20.2. Now implements
-       locking by using symlinks which is NFS safe. However keep the
-       GCPRO's in lock_file and the calls to callx_in_buffer like our old 
-       version (and of course use ansi C, acessor macros, etc).
-
-1998-09-06  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * process-unix.c (unix_create_process): Reset SIGHUP handler to
-       SIG_DFL. We now try to conserve any inherted SIG_IGN settings
-       in init_signals_very_early. However these should not be passed 
-       on to children attached to the new pty.
-
-1998-08-28  Andy Piper  <andyp@parallax.co.uk>
-
-       * glyphs-eimage.c (png_instantiate_unwind): clean up eimage after use.
-
-1998-09-07  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * fileio.c (file-name-directory, file_name_as_directory):
-         Don't call CORRECT_DIR_SEPS, even when #defined WINDOWSNT. 
-
-1998-09-02  Andy Piper  <andyp@parallax.co.uk>
-
-       * emacs.c (main_1): init_ralloc() if initialised and we have REL_ALLOC
-
-       * ralloc.c: uncomment __morecore.
-
-1998-09-92  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * event-msw.c(winsock_writer): Supply a dummy 4th argument to
-         WriteFile() to fix a winsock 1.x bug on Win95.
-
-1998-08-28  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * event-Xt.c (emacs_Xt_mapping_action): Check for device being
-       deleted.
-       (x_event_to_emacs_event): Ditto.
-       (emacs_Xt_handle_focus_event): Ditto.
-       (emacs_Xt_handle_magic_event): Ditto.
-
-       * console-x.h (struct x_device): New flag being_deleted.
-       (DEVICE_X_BEING_DELETED): New macro.
-
-       * device-x.c (x_IO_error_handler): Throw to top-level instead of
-       returning.  Before doing that, set the being_deleted flag on the
-       device.
-
-1998-08-27  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * device-x.c (x-seppuku-on-epipe): Removed.
-
-1998-08-26  Gunnar Evermann  <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
-       * frame-x.c (x_delete_frame): Flush the X output buffer after
-       calling XtDestroyWidget to ensure that the windows are really
-       killed right now. 
-
-1998-08-26  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * menubar-x.c (my_run_hook): New unused function.
-       (pre_activate_callback): Use run_hook for Qactivate_menubar_hook,
-       since we ignore the results of the contained functions anyway.
-
-1998-08-26  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * glyphs-eimage.c (gif_instantiate): Fix a crash in handling
-       interlaced GIF files that are smaller than 4 lines high...
-
-1998-08-31  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * buffer.c (map_over_sharing_buffers): Deleted.
-
-       * insdel.c (MAP_INDIRECT_BUFFERS): Move to buffer.h.
-
-       * buffer.c (Fkill_buffer): Keep indirect_children updated while
-       killing them.
-
-1998-08-31  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (buffer_insert_string_1): Advance the point bytind in
-       all the buffers.
-       (buffer_delete_range): Ditto.
-
-       * marker.c (init_buffer_markers): Set point-marker to the value of 
-       point in an indirect buffer.
-
-1998-08-30  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * undo.c (undo_prelude): Test last-undo-buffer against base
-       buffer.
-
-       * insdel.c (MAP_INDIRECT_BUFFERS): Use it.
-
-       * buffer.h (BUFFER_BASE_BUFFER): New macro.
-
-1998-08-30  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * insdel.c (init_buffer_text): Initialize it here.
-
-       * line-number.c: Address line_number_cache through buffer->text.
-
-       * buffer.c (mark_buffer): Mark line number cache.
-
-       * bufslots.h (line_number_cache): Move to struct buffer_text.
-
-       * insdel.c (buffer_insert_string_1): Propagate signals and changes
-       across the children buffers.
-       (buffer_delete_range): Ditto.
-       (buffer_replace_char): Ditto.
-       (gap_left): Ditto.
-       (gap_right): Ditto.
-
-       * insdel.c (MAP_INDIRECT_BUFFERS): New macro.
-
-       * buffer.c (Fmake_indirect_buffer): Uncomment.
-
-1998-08-31  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * macros.c (Fend_kbd_macro): Remove trailing period from error
-       message.
-       (Fexecute_kbd_macro): Ditto.
-
-1998-08-21  Greg Klanderman  <greg@alphatech.com>
-
-       * dired.c (Fuser_name_completion): remove optional 2nd argument.
-       (Fuser_name_completion_1): new function to return uniqueness
-       indication in addition to the user name completion.
-       (user_name_completion): change type of `uniq' argument.
-
-1998-08-19  Michael Sperber [Mr. Preprocessor]  <sperber@informatik.uni-tuebingen.de>
-
-       * lread.c (vars_of_lread): Removed `source-directory' variable.
-
-1998-08-22  Hrvoje Niksic  <hniksic@srce.hr>
-
-       * fileio.c (Ffile_readable_p): Apply the DOS/Windows logic to
-       Cygwin.
-
-1998-08-19  SL Baur  <steve@altair.xemacs.org>
-
-       * dired.c (vars_of_dired): Fix misapplied patch.
-
-1998-08-16  Martin Buchholz  <martin@xemacs.org>
-
-       * fns.c (Fremrassq, remrassq_no_quit):
-       A XCAR that should have been an XCDR turned Fremrassq into Fremassq
-
-1998-07-17  Didier Verna  <verna@inf.enst.fr>
-
-       * redisplay-x.c (x_get_gc): returns a GC with a FillStipple fill
-       style as foreground GC for faces that have the `dim' property.
-       (x_output_string): when the `dim' face property is set,
-       ensure the gray pixmap has been created, and get a proper
-       foreground GC to draw the text.
-
-1998-08-09  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * event-msw.c (mswindows_wnd_proc): Workaround for a Win95 bug:
-         Manually track the state of the left and right Ctrl and Alt
-         modifiers.
-
-1998-08-07 Matt Stupple <matts@tibco.com>
-
-        * ntproc.c: don't wait on char_consumed at thread entry. 
-       Additionally, to get the 'process' marked as finished, ensure
-       that the CHILD_ACTIVE macro returns false, so before exiting
-       close char_avail and set it to NULL, and close other handles
-       to reduce handle leak problems.
-
-1998-08-09  Jonathan Harris  <jhar@tardis.ed.ac.uk>
-
-       * menubar-msw.c (displayable_menu_item): take account of menu
-         depth when deciding whether to try to display accelerators.
-
-1998-08-04  Andy Piper  <andyp@parallax.co.uk>
-
-       * event-msw.c: use MsgWaitForMultipleObjects if there are no
-       subprocesses.
-
-       * glyphs-msw.c: fix a couple of potential handle leaks.
-
-1998-08-04  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * dgif_lib.c gif_io.c gifrlib.h: New files to put GIF
-         *decoding ONLY* back into the core.
-       * glyphs-eimage.c: Change referenced header file for GIF
-         reading to point to the incore version.
-
-1998-07-20  Martin Buchholz  <martin@xemacs.org>
-
-       * casefiddle.c (casify_object): 
-       Change algorithm from O(N**2) to O(N).
-       Code cleanup.
-       Doc string cleanup.
-
-1998-07-22  Greg Klanderman  <greg@alphatech.com>
-
-       * dired.c (file_name_completion_unwind): don't leak the cons.
-
-1998-07-20  Greg Klanderman  <greg@alphatech.com>
-
-       * dired.c (Fuser_name_completion): new function.
-       (Fuser_name_all_completions): new function.
-       (user_name_completion): new function.
-       (syms_of_dired): 2 new DEFSUBRs.
-       (vars_of_dired): initialize user name cache vars.
-
-1998-07-29  P. E. Jareth Hein  <jareth@camelot.co.jp>
-
-       * glyphs-eimage.c (png_instantiate): Add proper handling for background
-       colors taken from the default face.  Also correct a thinko in
-       transparency (not alpha) handling.
-
-1998-07-23  Martin Buchholz  <martin@xemacs.org>
-
-       * s/decosf4-0.h:  Use a perfectly ordinary link.  Nuke BSD crap.
-       * unexalpha.c: ANSI C-ize.  Clean compiler warnings.
-       * lread.c (Fload_internal):  Be very careful with printfs of
-       size_t's
-       * gui-x.c (menu_name_to_accelerator): tolower wants an `int'
-       argument.
-
-1998-07-27  Gunnar Evermann  <Gunnar.Evermann@nats.informatik.uni-hamburg.de>
-
-       * callint.c (Fcall_interactively): GCPRO prompt string before
-       passing it to Fread_key_sequence
-
-1998-07-27  SL Baur  <steve@altair.xemacs.org>
-
-       * keymap.c (vars_of_keymap): Initialize Vkey_translation_map and
-       Vvertical_divider_map.
-
-       * mule-canna.c (vars_of_mule_canna): Initialize every symbol to
-       Qnil or 0, none were initialized prior to this change.
-
-       Rename misnamed `V' prefixed integer variables:
-       Vcanna_empty_info, Vcanna_through_info, Vcanna_underline,
-       Vcanna_inhibit_hankakukana, Vcanna_henkan_length, Vcanna_henkan_revPos,
-       Vcanna_henkan_revLen, Vcanna_ichiran_length, Vcanna_ichiran_revPos,
-       Vcanna_ichiran_revLen.
-
-       Rename misnamed `V' prefixed integer variables and initialize
-       properly in the vars_of routine.
-       Vcanna_mode_AlphaMode, Vcanna_mode_EmptyMode, Vcanna_mode_KigoMode,
-       Vcanna_mode_YomiMode, Vcanna_mode_JishuMode, Vcanna_mode_TankouhoMode,
-       Vcanna_mode_IchiranMode, Vcanna_mode_YesNoMode, Vcanna_mode_OnOffMode,
-       Vcanna_mode_AdjustBunsetsuMode, Vcanna_mode_ChikujiYomiMode,
-       Vcanna_mode_ChikujiTanMode, Vcanna_mode_HenkanMode,
-       Vcanna_mode_HenkanNyuryokuMode, Vcanna_mode_ZenHiraHenkanMode,
-       Vcanna_mode_HanHiraHenkanMode, Vcanna_mode_ZenKataHenkanMode,
-       Vcanna_mode_HanKataHenkanMode, Vcanna_mode_HanKataHenkanMode,
-       Vcanna_mode_ZenAlphaHenkanMode, Vcanna_mode_HanAlphaHenkanMode,
-       Vcanna_mode_ZenHiraKakuteiMode, Vcanna_mode_HanHiraKakuteiMode,
-       Vcanna_mode_ZenKataKakuteiMode, Vcanna_mode_HanKataKakuteiMode,
-       Vcanna_mode_ZenAlphaKakuteiMode, Vcanna_mode_HanAlphaKakuteiMode,
-       Vcanna_mode_HexMode, Vcanna_mode_BushuMode, Vcanna_mode_ExtendMode,
-       Vcanna_mode_RussianMode, Vcanna_mode_GreekMode, Vcanna_mode_LineMode,
-       Vcanna_mode_ChangingServerMode, Vcanna_mode_HenkanMethodMode,
-       Vcanna_mode_DeleteDicMode, Vcanna_mode_TourokuMode,
-       Vcanna_mode_TourokuEmptyMode, Vcanna_mode_TourokuHinshiMode,
-       Vcanna_mode_TourokuDicMode, Vcanna_mode_QuotedInsertMode,
-       Vcanna_mode_BubunMuhenkanMode, Vcanna_mode_MountDicMode,
-       Vcanna_fn_SelfInsert, Vcanna_fn_FunctionalInsert,
-       Vcanna_fn_QuotedInsert, Vcanna_fn_JapaneseMode, Vcanna_fn_AlphaMode,
-       Vcanna_fn_HenkanNyuryokuMode, Vcanna_fn_Forward, Vcanna_fn_Backward,
-       Vcanna_fn_Next, Vcanna_fn_Prev, Vcanna_fn_BeginningOfLine,
-       Vcanna_fn_EndOfLine, Vcanna_fn_DeleteNext, Vcanna_fn_DeletePrevious,
-       Vcanna_fn_KillToEndOfLine, Vcanna_fn_Henkan, Vcanna_fn_Kakutei,
-       Vcanna_fn_Extend, Vcanna_fn_Shrink, Vcanna_fn_AdjustBunsetsu,
-       Vcanna_fn_Quit, Vcanna_fn_ConvertAsHex, Vcanna_fn_ConvertAsBushu,
-       Vcanna_fn_KouhoIchiran, Vcanna_fn_BubunMuhenkan, Vcanna_fn_Zenkaku,
-       Vcanna_fn_Hankaku, Vcanna_fn_ExtendMode, Vcanna_fn_ToUpper,
-       Vcanna_fn_Capitalize, Vcanna_fn_ToLower, Vcanna_fn_Hiragana,
-       Vcanna_fn_Katakana, Vcanna_fn_Romaji, Vcanna_fn_BaseHiragana,
-       Vcanna_fn_BaseKatakana, Vcanna_fn_BaseEisu, Vcanna_fn_BaseZenkaku,
-       Vcanna_fn_BaseHankaku, Vcanna_fn_BaseKana, Vcanna_fn_BaseKakutei,
-       Vcanna_fn_BaseHenkan, Vcanna_fn_BaseHiraKataToggle,
-       Vcanna_fn_BaseZenHanToggle, Vcanna_fn_BaseKanaEisuToggle,
-       Vcanna_fn_BaseKakuteiHenkanToggle, Vcanna_fn_BaseRotateForward,
-       Vcanna_fn_BaseRotateBackward, Vcanna_fn_Touroku, Vcanna_fn_HexMode,
-       Vcanna_fn_BushuMode, Vcanna_fn_KigouMode, Vcanna_fn_Mark,
-       Vcanna_fn_TemporalMode, Vcanna_key_Nfer, Vcanna_key_Xfer,
-       Vcanna_key_Up, Vcanna_key_Left, Vcanna_key_Right, Vcanna_key_Down,
-       Vcanna_key_Insert, Vcanna_key_Rollup, Vcanna_key_Rolldown,
-       Vcanna_key_Home, Vcanna_key_Help, Vcanna_key_KP_Key,
-       Vcanna_key_Shift_Nfer, Vcanna_key_Shift_Xfer, Vcanna_key_Shift_Up,
-       Vcanna_key_Shift_Left, Vcanna_key_Shift_Right, Vcanna_key_Shift_Down,
-       Vcanna_key_Cntrl_Nfer, Vcanna_key_Cntrl_Xfer, Vcanna_key_Cntrl_Up,
-       Vcanna_key_Cntrl_Left, Vcanna_key_Cntrl_Right, Vcanna_key_Cntrl_Down
-
-1998-07-16  Jan Vroonhof  <vroonhof@math.ethz.ch>
-
-       * event-Xt.c (x_to_emacs_keysym): Return nil for modifier keysyms.
-       (x_event_to_emacs_event): Let x_to_emacs_keysym check for modifier 
-       keys thus no longer considering all keysyms on a key.
-
 1998-07-19  SL Baur  <steve@altair.xemacs.org>
 
        * XEmacs 21.2-beta1 is released.
diff --git a/src/acldef.h b/src/acldef.h
new file mode 100644 (file)
index 0000000..eba2c59
--- /dev/null
@@ -0,0 +1,65 @@
+/* This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.30. */
+
+/* Authorship:
+
+   FSF: Original version; a long time ago.
+   No changes for XEmacs.
+ */
+
+#define        ACL$K_LENGTH    12
+#define        ACL$C_LENGTH    12
+#define        ACL$C_FILE      1
+#define        ACL$C_DEVICE    2
+#define        ACL$C_JOBCTL_QUEUE      3
+#define        ACL$C_COMMON_EF_CLUSTER 4
+#define        ACL$C_LOGICAL_NAME_TABLE        5
+#define        ACL$C_PROCESS   6
+#define        ACL$C_GROUP_GLOBAL_SECTION      7
+#define        ACL$C_SYSTEM_GLOBAL_SECTION     8
+#define        ACL$C_ADDACLENT 1
+#define        ACL$C_DELACLENT 2
+#define        ACL$C_MODACLENT 3
+#define        ACL$C_FNDACLENT 4
+#define        ACL$C_FNDACETYP 5
+#define        ACL$C_DELETEACL 6
+#define        ACL$C_READACL   7
+#define        ACL$C_ACLLENGTH 8
+#define        ACL$C_READACE   9
+#define        ACL$C_RLOCK_ACL 10
+#define        ACL$C_WLOCK_ACL 11
+#define        ACL$C_UNLOCK_ACL        12
+#define        ACL$S_ADDACLENT 255
+#define        ACL$S_DELACLENT 255
+#define        ACL$S_MODACLENT 255
+#define        ACL$S_FNDACLENT 255
+#define        ACL$S_FNDACETYP 255
+#define        ACL$S_DELETEACL 255
+#define        ACL$S_READACL   512
+#define        ACL$S_ACLLENGTH 4
+#define        ACL$S_READACE   255
+#define        ACL$S_RLOCK_ACL 4
+#define        ACL$S_WLOCK_ACL 4
+#define        ACL$S_UNLOCK_ACL        4
+#define        ACL$S_ACLDEF    16
+#define        ACL$L_FLINK     0
+#define        ACL$L_BLINK     4
+#define        ACL$W_SIZE      8
+#define        ACL$B_TYPE      10
+#define        ACL$L_LIST      12
index 7b88d68..81acfbc 100644 (file)
@@ -232,8 +232,6 @@ mark_buffer (Lisp_Object obj, void (*markobj) (Lisp_Object))
 #undef MARKED_SLOT
 
   ((markobj) (buf->extent_info));
-  if (buf->text)
-    ((markobj) (buf->text->line_number_cache));
 
   /* Don't mark normally through the children slot.
      (Actually, in this case, it doesn't matter.)  */
@@ -616,11 +614,12 @@ The value is never nil.
   b->text = &b->own_text;
   b->base_buffer = 0;
   b->indirect_children = Qnil;
-  init_buffer_text (b);
+  init_buffer_text (b, 0);
 
   return finish_init_buffer (b, name);
 }
 
+#if 0 /* #### implement this!  Need various changes in insdel.c */
 DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, 2, 2,
        "bMake indirect buffer (to buffer): \nBName of indirect buffer: ", /*
 Create and return an indirect buffer for buffer BASE, named NAME.
@@ -632,40 +631,44 @@ If BASE is an indirect buffer itself, the base buffer for that buffer
 */
        (base_buffer, name))
 {
-  /* This function can GC */
-
-  /* #### The above interactive specification is totally bogus,
-     because it offers an existing buffer as default answer to the
-     second question.  However, the second argument may not BE an
-     existing buffer!  */
-  struct buffer *b;
-
-  base_buffer = get_buffer (base_buffer, 1);
+  Lisp_Object buf;
+  REGISTER struct buffer *b;
 
 #ifdef I18N3
   /* #### Doc string should indicate that the buffer name will get
      translated. */
 #endif
-  CHECK_STRING (name);
+
   name = LISP_GETTEXT (name);
-  if (!NILP (Fget_buffer (name)))
-    signal_simple_error ("Buffer name already in use", name);
+  buf = Fget_buffer (name);
+  if (!NILP (buf))
+    error ("Buffer name `%s' is in use", XSTRING_DATA (name));
+
+  base_buffer = Fget_buffer (base_buffer);
+  if (NILP (base_buffer))
+    error ("No such buffer: `%s'", XSTRING_DATA (XBUFFER (base_buffer)->name));
+
   if (XSTRING_LENGTH (name) == 0)
     error ("Empty string for buffer name is not allowed");
 
   b = allocate_buffer ();
 
-  b->base_buffer = BUFFER_BASE_BUFFER (XBUFFER (base_buffer));
+  if (XBUFFER (base_buffer)->base_buffer)
+    b->base_buffer = XBUFFER (base_buffer)->base_buffer;
+  else
+    b->base_buffer = XBUFFER (base_buffer);
 
   /* Use the base buffer's text object.  */
   b->text = b->base_buffer->text;
   b->indirect_children = Qnil;
+  XSETBUFFER (buf, b);
   b->base_buffer->indirect_children =
-    Fcons (make_buffer (b), b->base_buffer->indirect_children);
-  init_buffer_text (b);
+    Fcons (buf, b->base_buffer->indirect_children);
+  init_buffer_text (b, 1);
 
   return finish_init_buffer (b, name);
 }
+#endif /* 0 */
 
 
 \f
@@ -811,6 +814,41 @@ If BUFFER is indirect, the return value will always be nil; see
   return Fcopy_sequence (buf->indirect_children);
 }
 
+/* Map MAPFUN over all buffers that share the same text as BUF
+   (this includes BUF).  Pass two arguments to MAPFUN: a buffer,
+   and CLOSURE.  If any invocation of MAPFUN returns non-zero,
+   halt immediately and return that value.  Otherwise, continue
+   the mapping to the end and return 0. */
+
+int
+map_over_sharing_buffers (struct buffer *buf,
+                         int (*mapfun) (struct buffer *buf, void *closure),
+                         void *closure)
+{
+  int result;
+  Lisp_Object tail;
+
+  if (buf->base_buffer)
+    {
+      buf = buf->base_buffer;
+      assert (!buf->base_buffer);
+    }
+
+  result = (mapfun) (buf, closure);
+  if (result)
+    return result;
+
+  LIST_LOOP (tail, buf->indirect_children)
+    {
+      Lisp_Object buffer = XCAR (tail);
+      result = (mapfun) (XBUFFER (buffer), closure);
+      if (result)
+       return result;
+    }
+
+  return 0;
+}
+
 DEFUN ("buffer-local-variables", Fbuffer_local_variables, 0, 1, 0, /*
 Return an alist of variables that are buffer-local in BUFFER.
 Most elements look like (SYMBOL . VALUE), describing one variable.
@@ -1249,12 +1287,7 @@ with `delete-process'.
       GCPRO1 (buf);
 
       LIST_LOOP (rest, b->indirect_children)
-       {
-         Fkill_buffer (XCAR (rest));
-         /* Keep indirect_children updated in case a
-             query-function/hook throws.  */
-         b->indirect_children = XCDR (rest);
-       }
+       Fkill_buffer (XCAR (rest));
 
       UNGCPRO;
     }
@@ -1339,7 +1372,7 @@ with `delete-process'.
     kill_buffer_local_variables (b);
 
     b->name = Qnil;
-    uninit_buffer_text (b);
+    uninit_buffer_text (b, !!b->base_buffer);
     b->undo_list = Qnil;
     uninit_buffer_extents (b);
     if (b->base_buffer)
@@ -1836,7 +1869,9 @@ syms_of_buffer (void)
   DEFSUBR (Fget_buffer);
   DEFSUBR (Fget_file_buffer);
   DEFSUBR (Fget_buffer_create);
+#if 0
   DEFSUBR (Fmake_indirect_buffer);
+#endif
 
   DEFSUBR (Fgenerate_new_buffer_name);
   DEFSUBR (Fbuffer_name);
index 0a7b634..7e0ce23 100644 (file)
@@ -102,10 +102,6 @@ struct buffer_text
   Bytind mule_bytind_cache[16];
 #endif
 
-  /* Similar to the above, we keep track of positions for which line
-     number has last been calculated.  See line-number.c. */
-  Lisp_Object line_number_cache;
-
   /* Change data that goes with the text. */
   struct buffer_text_change_data *changes;
 
@@ -237,23 +233,6 @@ DECLARE_LRECORD (buffer, struct buffer);
     x = wrong_type_argument (Qbuffer_live_p, (x));     \
 } while (0)
 
-#define BUFFER_BASE_BUFFER(b) ((b)->base_buffer ? (b)->base_buffer : (b))
-
-/* Map over buffers sharing the same text as MPS_BUF.  MPS_BUFVAR is a
-   variable that gets the buffer values (beginning with the base
-   buffer, then the children), and MPS_BUFCONS should be a temporary
-   Lisp_Object variable.  */
-#define MAP_INDIRECT_BUFFERS(mps_buf, mps_bufvar, mps_bufcons)                 \
-for (mps_bufcons = Qunbound,                                                   \
-     mps_bufvar = BUFFER_BASE_BUFFER (mps_buf);                                        \
-     UNBOUNDP (mps_bufcons) ?                                                  \
-       (mps_bufcons = mps_bufvar->indirect_children,                           \
-       1)                                                                      \
-       : (!NILP (mps_bufcons)                                                  \
-         && (mps_bufvar = XBUFFER (XCAR (mps_bufcons)), 1)                     \
-         && (mps_bufcons = XCDR (mps_bufcons), 1));                            \
-     )
-
 \f
 /* NOTE: In all the following macros, we follow these rules concerning
    multiple evaluation of the arguments:
index e3e4b16..000a943 100644 (file)
@@ -241,3 +241,7 @@ Boston, MA 02111-1307, USA.  */
        the next few times we add a new slot.  */
     MARKED_SLOT (extra1, extra2, extra3);
 #endif
+  /* The cache of positions for whilch line number has last been
+     calculated.  See line-number.c. */
+    MARKED_SLOT (line_number_cache);
+
index 78f3789..cb21d57 100644 (file)
@@ -1,5 +1,5 @@
 /* XEmacs case conversion functions.
-   Copyright (C) 1985, 1992, 1993, 1994, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1992, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of XEmacs.
 
@@ -18,12 +18,13 @@ along with XEmacs; see the file COPYING.  If not, write to
 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-/* Synched up with: FSF 19.34, but substantially rewritten by Martin. */
+/* Synched up with: FSF 19.34. */
 
 #include <config.h>
 #include "lisp.h"
 
 #include "buffer.h"
+#include "commands.h"
 #include "insdel.h"
 #include "syntax.h"
 
@@ -33,117 +34,100 @@ static Lisp_Object
 casify_object (enum case_action flag, Lisp_Object obj, Lisp_Object buffer)
 {
   struct buffer *buf = decode_buffer (buffer, 0);
+  REGISTER int inword = (flag == CASE_DOWN);
+  struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
 
- retry:
-
-  if (CHAR_OR_CHAR_INTP (obj))
-    {
-      Emchar c;
-      CHECK_CHAR_COERCE_INT (obj);
-      c = XCHAR (obj);
-      c = (flag == CASE_DOWN) ? DOWNCASE (buf, c) : UPCASE (buf, c);
-      return make_char (c);
-    }
-
-  if (STRINGP (obj))
+  while (1)
     {
-      struct Lisp_Char_Table *syntax_table =
-       XCHAR_TABLE (buf->mirror_syntax_table);
-      Bufbyte *storage =
-       alloca_array (Bufbyte, XSTRING_LENGTH (obj) * MAX_EMCHAR_LEN);
-      Bufbyte *newp = storage;
-      Bufbyte *oldp = XSTRING_DATA (obj);
-      int wordp = 0, wordp_prev;
-
-      while (*oldp)
+      if (CHAR_OR_CHAR_INTP (obj))
        {
-         Emchar c = charptr_emchar (oldp);
-         switch (flag)
+         Emchar c;
+         CHECK_CHAR_COERCE_INT (obj);
+         c = XCHAR (obj);
+         if (IN_TRT_TABLE_DOMAIN (c))
            {
-           case CASE_UP:
-             c = UPCASE (buf, c);
-             break;
-           case CASE_DOWN:
-             c = DOWNCASE (buf, c);
-             break;
-           case CASE_CAPITALIZE:
-           case CASE_CAPITALIZE_UP:
-             wordp_prev = wordp;
-             wordp = WORD_SYNTAX_P (syntax_table, c);
-             if (!wordp) break;
-             if (wordp_prev)
-               {
-                 if (flag == CASE_CAPITALIZE)
-                   c = DOWNCASE (buf, c);
-               }
-             else
-               c = UPCASE (buf, c);
-             break;
+             if (inword)
+               obj = make_char (DOWNCASE (buf, c));
+             else if (!UPPERCASEP (buf, c))
+               obj = make_char (UPCASE1 (buf, c));
            }
-
-         newp += set_charptr_emchar (newp, c);
-         INC_CHARPTR (oldp);
+         return obj;
        }
-
-      return make_string (storage, newp - storage);
+      if (STRINGP (obj))
+       {
+         Charcount i;
+         Charcount len = XSTRING_CHAR_LENGTH (obj);
+         obj = Fcopy_sequence (obj);
+         for (i = 0; i < len; i++)
+           {
+             Emchar c = string_char (XSTRING (obj), i);
+             if (inword && flag != CASE_CAPITALIZE_UP)
+               c = DOWNCASE (buf, c);
+             else if (!UPPERCASEP (buf, c)
+                      && (!inword || flag != CASE_CAPITALIZE_UP))
+               c = UPCASE1 (buf, c);
+             set_string_char (XSTRING (obj), i, c);
+             if ((int) flag >= (int) CASE_CAPITALIZE)
+               inword = WORD_SYNTAX_P (syntax_table, c);
+           }
+         return obj;
+       }
+      obj = wrong_type_argument (Qchar_or_string_p, obj);
     }
-
-  obj = wrong_type_argument (Qchar_or_string_p, obj);
-  goto retry;
 }
 
 DEFUN ("upcase", Fupcase, 1, 2, 0, /*
-Convert OBJECT to upper case and return that.
-OBJECT may be a character or string.  The result has the same type.
-OBJECT is not altered--the value is a copy.
+Convert argument to upper case and return that.
+The argument may be a character or string.  The result has the same type.
+The argument object is not altered--the value is a copy.
 See also `capitalize', `downcase' and `upcase-initials'.
 Optional second arg BUFFER specifies which buffer's case tables to use,
  and defaults to the current buffer.
 */
-       (object, buffer))
+       (obj, buffer))
 {
-  return casify_object (CASE_UP, object, buffer);
+  return casify_object (CASE_UP, obj, buffer);
 }
 
 DEFUN ("downcase", Fdowncase, 1, 2, 0, /*
-Convert OBJECT to lower case and return that.
-OBJECT may be a character or string.  The result has the same type.
-OBJECT is not altered--the value is a copy.
+Convert argument to lower case and return that.
+The argument may be a character or string.  The result has the same type.
+The argument object is not altered--the value is a copy.
 Optional second arg BUFFER specifies which buffer's case tables to use,
  and defaults to the current buffer.
 */
-       (object, buffer))
+       (obj, buffer))
 {
-  return casify_object (CASE_DOWN, object, buffer);
+  return casify_object (CASE_DOWN, obj, buffer);
 }
 
 DEFUN ("capitalize", Fcapitalize, 1, 2, 0, /*
-Convert OBJECT to capitalized form and return that.
+Convert argument to capitalized form and return that.
 This means that each word's first character is upper case
 and the rest is lower case.
-OBJECT may be a character or string.  The result has the same type.
-OBJECT is not altered--the value is a copy.
+The argument may be a character or string.  The result has the same type.
+The argument object is not altered--the value is a copy.
 Optional second arg BUFFER specifies which buffer's case tables to use,
  and defaults to the current buffer.
 */
-       (object, buffer))
+       (obj, buffer))
 {
-  return casify_object (CASE_CAPITALIZE, object, buffer);
+  return casify_object (CASE_CAPITALIZE, obj, buffer);
 }
 
-/* Like Fcapitalize but change only the initial characters.  */
+/* Like Fcapitalize but change only the initials.  */
 
 DEFUN ("upcase-initials", Fupcase_initials, 1, 2, 0, /*
-Convert the initial of each word in OBJECT to upper case.
+Convert the initial of each word in the argument to upper case.
 Do not change the other letters of each word.
-OBJECT may be a character or string.  The result has the same type.
-OBJECT is not altered--the value is a copy.
+The argument may be a character or string.  The result has the same type.
+The argument object is not altered--the value is a copy.
 Optional second arg BUFFER specifies which buffer's case tables to use,
  and defaults to the current buffer.
 */
-       (object, buffer))
+       (obj, buffer))
 {
-  return casify_object (CASE_CAPITALIZE_UP, object, buffer);
+  return casify_object (CASE_CAPITALIZE_UP, obj, buffer);
 }
 \f
 /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
@@ -156,10 +140,9 @@ casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e,
   /* This function can GC */
   REGISTER Bufpos i;
   Bufpos start, end;
+  REGISTER int inword = (flag == CASE_DOWN);
   struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table);
   int mccount;
-  Emchar oldc, c;
-  int wordp = 0, wordp_prev;
 
   if (EQ (b, e))
     /* Not modifying because nothing marked */
@@ -172,38 +155,25 @@ casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e,
 
   for (i = start; i < end; i++)
     {
-      c = oldc = BUF_FETCH_CHAR (buf, i);
+      Emchar c = BUF_FETCH_CHAR (buf, i);
+      Emchar oldc = c;
 
-      switch (flag)
+      if (inword && flag != CASE_CAPITALIZE_UP)
+       c = DOWNCASE (buf, c);
+      else if (!UPPERCASEP (buf, c)
+              && (!inword || flag != CASE_CAPITALIZE_UP))
+       c = UPCASE1 (buf, c);
+
+      if (oldc != c)
        {
-       case CASE_UP:
-         c = UPCASE (buf, oldc);
-         break;
-       case CASE_DOWN:
-         c = DOWNCASE (buf, oldc);
-         break;
-       case CASE_CAPITALIZE:
-       case CASE_CAPITALIZE_UP:
-         /* !!#### need to revalidate the start and end pointers in case
-            the buffer was changed */
-         wordp_prev = wordp;
-         wordp = WORD_SYNTAX_P (syntax_table, c);
-         if (!wordp) continue;
-         if (wordp_prev)
-           {
-             if (flag == CASE_CAPITALIZE)
-               c = DOWNCASE (buf, c);
-           }
-         else
-           c = UPCASE (buf, c);
-         break;
+         buffer_replace_char (buf, i, c, 1, (i == start));
+         BUF_MODIFF (buf)++;
        }
-
-      if (oldc == c) continue;
-      buffer_replace_char (buf, i, c, 1, (i == start));
-      BUF_MODIFF (buf)++;
+      /* !!#### need to revalidate the start and end pointers in case
+        the buffer was changed */
+      if ((int) flag >= (int) CASE_CAPITALIZE)
+       inword = WORD_SYNTAX_P (syntax_table, c);
     }
-
   end_multiple_change (buf, mccount);
 }
 
diff --git a/src/chpdef.h b/src/chpdef.h
new file mode 100644 (file)
index 0000000..196196c
--- /dev/null
@@ -0,0 +1,57 @@
+/* This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.30. */
+
+#define        CHP$_END        0
+#define        CHP$_ACCESS     1
+#define        CHP$_FLAGS      2
+#define        CHP$_PRIV       3
+#define        CHP$_ACMODE     4
+#define        CHP$_ACCLASS    5
+#define        CHP$_RIGHTS     6
+#define        CHP$_ADDRIGHTS  7
+#define        CHP$_MODE       8
+#define        CHP$_MODES      9
+#define        CHP$_MINCLASS   10
+#define        CHP$_MAXCLASS   11
+#define        CHP$_OWNER      12
+#define        CHP$_PROT       13
+#define        CHP$_ACL        14
+#define        CHP$_AUDITNAME  15
+#define        CHP$_ALARMNAME  16
+#define        CHP$_MATCHEDACE 17
+#define        CHP$_PRIVUSED   18
+#define        CHP$_MAX_CODE   19
+#define        CHP$M_SYSPRV    1
+#define        CHP$M_BYPASS    2
+#define        CHP$M_UPGRADE   4
+#define        CHP$M_DOWNGRADE 8
+#define        CHP$M_GRPPRV    16
+#define        CHP$M_READALL   32
+#define        CHP$V_SYSPRV    0
+#define        CHP$V_BYPASS    1
+#define        CHP$V_UPGRADE   2
+#define        CHP$V_DOWNGRADE 3
+#define        CHP$V_GRPPRV    4
+#define        CHP$V_READALL   5
+#define        CHP$M_READ      1
+#define        CHP$M_WRITE     2
+#define        CHP$M_USEREADALL        4
+#define        CHP$V_READ      0
+#define        CHP$V_WRITE     1
+#define        CHP$V_USEREADALL        2
index b78318e..d8508cc 100644 (file)
@@ -194,7 +194,6 @@ char *alloca();
 #undef HAVE_ULIMIT_H
 #undef HAVE_X11_XLOCALE_H
 #undef HAVE_LINUX_VERSION_H
-#undef HAVE_CYGWIN32_VERSION_H
 #undef HAVE_INTTYPES_H
 #undef HAVE_SYS_UN_H
 #undef HAVE_A_OUT_H
index aa1f594..91f91db 100644 (file)
@@ -70,9 +70,6 @@ struct x_device
   /* The X connection of this device. */
   Display *display;
 
-  /* Set by x_IO_error_handler(). */
-  int being_deleted;
-
   /* Xt application info. */
   Widget Xt_app_shell;
 
@@ -187,7 +184,6 @@ struct x_device
 
 #define FRAME_X_DISPLAY(f) (DEVICE_X_DISPLAY (XDEVICE (f->device)))
 #define DEVICE_X_DISPLAY(d)    (DEVICE_X_DATA (d)->display)
-#define DEVICE_X_BEING_DELETED(d) (DEVICE_X_DATA (d)->being_deleted)
 #define DEVICE_X_VISUAL(d)     (DEVICE_X_DATA (d)->visual)
 #define DEVICE_X_DEPTH(d)      (DEVICE_X_DATA (d)->depth)
 #define DEVICE_X_COLORMAP(d)   (DEVICE_X_DATA (d)->device_cmap)
diff --git a/src/dbxrc b/src/dbxrc
new file mode 100644 (file)
index 0000000..b9ae837
--- /dev/null
+++ b/src/dbxrc
@@ -0,0 +1,318 @@
+# -*- ksh -*-
+# Copyright (C) 1998 Free Software Foundation, Inc.
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Author: Martin Buchholz
+
+# You can use this file to debug XEmacs using Sun WorkShop's dbx.
+# Add the contents of this file to $HOME/.dbxrc or
+# Source the contents of this file with something like:
+# test -r ./dbxrc && . ./dbxrc
+
+# Some functions defined here require a running process, but most
+# don't.  Considerable effort has been expended to this end.
+
+# See also the comments in gdbinit.
+
+# See also the question of the XEmacs FAQ, titled
+# "How to Debug an XEmacs problem with a debugger".
+
+ignore POLL
+ignore IO
+
+document lbt << 'end'
+Usage: lbt
+Print the current Lisp stack trace.
+Requires a running xemacs process.
+end
+
+function lbt {
+  call debug_backtrace()
+}
+
+document ldp << 'end'
+Usage: ldp lisp_object
+Print a Lisp Object value using the Lisp printer.
+Requires a running xemacs process.
+end
+
+function ldp {
+  call debug_print ($1);
+}
+
+# A bug in dbx prevents string variables from having values beginning with `-'!!
+function XEmacsInit {
+  eval $(echo $(whatis -t `alloc.c`dbg_constants) | \
+    perl -e 'print "@{[map {s/=(-\d+)/sprintf(q[=0x%x],$1)/oge; /\w+=[0-9a-fx]+/og} <>]}\n"')
+  xemacs_initted=yes
+  #printvar dbg_valbits dbg_valmask
+}
+
+function printvar {
+  for i in $*; do eval "echo $i=\$$i"; done
+}
+
+document decode_object << 'end'
+Usage: decode_object lisp_object
+Extract implementation information from a Lisp Object.
+Defines variables $val, $type and $imp.
+end
+
+# Various dbx bugs cause ugliness in following code
+function decode_object {
+  test -z "$xemacs_initted" && XEmacsInit
+  obj=$[*(void**)(&$1)]
+  test "$obj" = "(nil)" && obj="0x0"
+  if test $dbg_USE_MINIMAL_TAGBITS = 1; then
+    if test $[(int)($obj & 1)] = 1; then
+      # It's an int
+      val=$[(long)(((unsigned long long)$obj) >> 1)]
+      type=$dbg_Lisp_Type_Int
+    else
+      type=$[(int)(((void*)$obj) & $dbg_typemask)]
+      if test $type = $dbg_Lisp_Type_Char; then
+        val=$[(void*)(long)(((unsigned long long)($obj & $dbg_valmask)) >> $dbg_gctypebits)]
+      else
+        # It's a record pointer
+        val=$[(void*)$obj]
+      fi
+    fi
+  else
+    # not dbg_USE_MINIMAL_TAGBITS
+    val=$[(void*)($obj & $dbg_valmask)]
+    test "$val" = "(nil)" && val="0x0"
+    type=$[(int)(((unsigned long long)($obj & $dbg_typemask)) >> ($dbg_valbits + 1))]
+  fi
+
+  if test $type = $dbg_Lisp_Type_Record; then
+    typeset lheader="((struct lrecord_header *) $val)"
+    if test $dbg_USE_INDEXED_LRECORD_IMPLEMENTATION = 1; then
+      imp=$[(void*)(lrecord_implementations_table[$lheader->type])]
+    else
+      imp=$[(void*)($lheader->implementation)]
+    fi
+  else
+    imp="0xdeadbeef"
+  fi
+  #printvar obj val type imp
+}
+
+function xint {
+  decode_object "$*"
+  print (long) ($val)
+}
+
+function xtype {
+  decode_object "$*"
+  if   test $type = $dbg_Lisp_Type_Int;    then echo "int"
+  elif test $type = $dbg_Lisp_Type_Char;   then echo "char"
+  elif test $type = $dbg_Lisp_Type_Symbol; then echo "symbol"
+  elif test $type = $dbg_Lisp_Type_String; then echo "string"
+  elif test $type = $dbg_Lisp_Type_Vector; then echo "vector"
+  elif test $type = $dbg_Lisp_Type_Cons;   then echo "cons"
+  else
+    echo "record type with name: $[((struct lrecord_implementation *)$imp)->name]"
+  fi
+}
+
+document run-temacs << 'end'
+Usage: run-temacs
+Run temacs interactively, like xemacs.
+Use this with debugging tools (like purify) that cannot deal with dumping,
+or when temacs builds successfully, but xemacs does not.
+end
+
+function run-temacs {
+  unset EMACSLOADPATH
+  export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+  run -batch -l ../lisp/loadup.el run-temacs -q
+}
+
+document update-elc << 'end'
+Usage: update-elc
+Run the core lisp byte compilation part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+function update-elc {
+  unset EMACSLOADPATH
+  export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+  run -batch -l ../lisp/update-elc.el
+}
+
+
+function dump-temacs {
+  unset EMACSLOADPATH
+  export EMACSBOOTSTRAPLOADPATH=../lisp/:..
+  run -batch -l ../lisp/loadup.el dump
+}
+
+document dump-temacs << 'end'
+Usage: dump-temacs
+Run the dumping part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+function pstruct {
+  xstruct="((struct $1 *) $val)"
+  print $xstruct
+  print *$xstruct
+}
+
+function lrecord_type_p {
+  if eval test -z \"\$lrecord_$1\" && test $imp = $[(void*)(&lrecord_$1)]; then return 0; else return 1; fi
+}
+
+document pobj << 'end'
+Usage: pobj lisp_object
+Print the internal C structure of a underlying Lisp Object.
+end
+
+function pobj {
+  decode_object $1
+  if test $type = $dbg_Lisp_Type_Int; then
+    print -f"Integer: %d" $val
+  elif test $type = $dbg_Lisp_Type_Char; then
+    if $val < 128; then
+      print -f"Char: %c" $val
+    else
+      print -f"Char: %d" $val
+    fi
+  elif test $type = $dbg_Lisp_Type_String || lrecord_type_p string; then
+    pstruct Lisp_String
+  elif test $type = $dbg_Lisp_Type_Cons   || lrecord_type_p cons; then
+    pstruct Lisp_Cons
+  elif test $type = $dbg_Lisp_Type_Symbol || lrecord_type_p symbol; then
+    pstruct Lisp_Symbol
+    echo "Symbol name: $[(char *)($xstruct->name->_data)]"
+  elif test $type = $dbg_Lisp_Type_Vector || lrecord_type_p vector; then
+    pstruct Lisp_Vector
+    echo "Vector of length $[$xstruct->size]"
+  elif lrecord_type_p bit_vector; then
+    pstruct Lisp_Bit_Vector
+  elif lrecord_type_p buffer; then
+    pstruct buffer
+  elif lrecord_type_p char_table; then
+    pstruct Lisp_Char_Table
+  elif lrecord_type_p char_table_entry; then
+    pstruct Lisp_Char_Table_Entry
+  elif lrecord_type_p charset; then
+    pstruct Lisp_Charset
+  elif lrecord_type_p coding_system; then
+    pstruct Lisp_Coding_System
+  elif lrecord_type_p color_instance; then
+    pstruct Lisp_Color_Instance
+  elif lrecord_type_p command_builder; then
+    pstruct command_builder
+  elif lrecord_type_p compiled_function; then
+    pstruct Lisp_Compiled_Function
+  elif lrecord_type_p console; then
+    pstruct console
+  elif lrecord_type_p database; then
+    pstruct database
+  elif lrecord_type_p device; then
+    pstruct device
+  elif lrecord_type_p event; then
+    pstruct Lisp_Event
+  elif lrecord_type_p extent; then
+    pstruct extent
+  elif lrecord_type_p extent_auxiliary; then
+    pstruct extent_auxiliary
+  elif lrecord_type_p extent_info; then
+    pstruct extent_info
+  elif lrecord_type_p face; then
+    pstruct Lisp_Face
+  elif lrecord_type_p float; then
+    pstruct Lisp_Float
+  elif lrecord_type_p font_instance; then
+    pstruct Lisp_Font_Instance
+  elif lrecord_type_p frame; then
+    pstruct frame
+  elif lrecord_type_p glyph; then
+    pstruct Lisp_Glyph
+  elif lrecord_type_p hashtable; then
+    pstruct hashtable
+  elif lrecord_type_p image_instance; then
+    pstruct Lisp_Image_Instance
+  elif lrecord_type_p keymap; then
+    pstruct keymap
+  elif lrecord_type_p lcrecord_list; then
+    pstruct lcrecord_list
+  elif lrecord_type_p lstream; then
+    pstruct lstream
+  elif lrecord_type_p marker; then
+    pstruct Lisp_Marker
+  elif lrecord_type_p opaque; then
+    pstruct Lisp_Opaque
+  elif lrecord_type_p opaque_list; then
+    pstruct Lisp_Opaque_List
+  elif lrecord_type_p popup_data; then
+    pstruct popup_data
+  elif lrecord_type_p process; then
+    pstruct Lisp_Process
+  elif lrecord_type_p range_table; then
+    pstruct Lisp_Range_Table
+  elif lrecord_type_p specifier; then
+    pstruct Lisp_Specifier
+  elif lrecord_type_p subr; then
+    pstruct Lisp_Subr
+  elif lrecord_type_p symbol_value_buffer_local; then
+    pstruct symbol_value_buffer_local
+  elif lrecord_type_p symbol_value_forward; then
+    pstruct symbol_value_forward
+  elif lrecord_type_p symbol_value_lisp_magic; then
+    pstruct symbol_value_lisp_magic
+  elif lrecord_type_p symbol_value_varalias; then
+    pstruct symbol_value_varalias
+  elif lrecord_type_p toolbar_button; then
+    pstruct toolbar_button
+  elif lrecord_type_p tooltalk_message; then
+    pstruct Lisp_Tooltalk_Message
+  elif lrecord_type_p tooltalk_pattern; then
+    pstruct Lisp_Tooltalk_Pattern
+  elif lrecord_type_p weak_list; then
+    pstruct weak_list
+  elif lrecord_type_p window; then
+    pstruct window
+  elif lrecord_type_p window_configuration; then
+    pstruct window_config
+  else
+    echo "Unknown Lisp Object type"
+    print $1
+  fi
+}
+
+function pproc {
+  print *(`process.c`struct Lisp_Process*)$1 ;
+  ldp "(`process.c`struct Lisp_Process*)$1->name" ;
+  ldp "(`process.c`struct Lisp_Process*)$1->command" ;
+}
+
+dbxenv suppress_startup_message 4.0
+
+function dp_core {
+  print ((struct x_frame *)(((struct frame*)(Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget->core
+}
+
+# Barf!
+function print_shell {
+  print *(`frame-x.c`TopLevelShellRec*) (((struct `frame-x.c`x_frame*) (((struct `frame-x.c`frame*) (Fselected_frame(Qnil)&0x00FFFFFF))->frame_data))->widget)
+}
diff --git a/src/dll.c b/src/dll.c
new file mode 100644 (file)
index 0000000..94225cf
--- /dev/null
+++ b/src/dll.c
@@ -0,0 +1,94 @@
+/* Lisp interface to dynamic loading.
+   Copyright (C) 1998  Joshua Rowe.
+   Additional cleanup by Hrvoje Niksic.
+
+This file is part of XEmacs.
+
+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; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+/* A shared object must have the symbol `emacs_initialize' defined.
+   It should contain initialization of functions, symbols, etc. and
+   their loading into Lisp-land.  The function will be called without
+   arguments and is not expected to return any.
+
+   All of this needs lots and LOTS of work.  Some things to work on:
+
+   1) A good foreign interface.  This is probably tough, because it
+   implies drawing a new border between "external" and "internal"
+   stuff (traditionally, Lisp code was external, while C was
+   internal).  Also, we need a modules/ directory with a few nice
+   sample modules, a sample Makefile, etc. so people can start
+   hacking.
+
+   2) All of this is sooo simple-minded.  As it gets more complex,
+   we'll have to look at how others have done similar things
+   (e.g. Perl 5 and Zsh 3.1), to avoid botching it up.  */
+
+#include <config.h>
+#include "lisp.h"
+#include "buffer.h"
+#include "sysdll.h"
+#include <errno.h>
+
+DEFUN ("dll-open", Fdll_open, 1, 1, "FShared object: ", /*
+Load LIBRARY as a shared object file.
+
+After the LIBRARY is dynamically linked with the executable, the
+`emacs_initialize' function will be called without arguments.  It
+should define all the symbols, subr's and variables the module
+introduces.
+
+After this point, any lisp symbols defined in the shared object are
+available for use.
+*/
+       (library))
+{
+  /* This function can GC */
+  dll_handle *handle;
+  void (*function) (void);
+  CONST char *filename;
+
+  CHECK_STRING (library);
+  library = Fexpand_file_name (library, Qnil);
+
+  GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (XSTRING_DATA (library), filename);
+
+  handle = (dll_handle *) dll_open (filename);
+  if (handle == NULL)
+    {
+      signal_error (Qerror,
+                   list3 (build_translated_string ("Cannot load shared library"),
+                          library, build_translated_string (dll_error (handle))));
+    }
+
+  /* #### Perhaps emacs_initialize() should return a Lisp_Object, so
+     we can return it?  */
+
+  function = (void (*)(void)) dll_function (handle, "emacs_initialize");
+  if (!function)
+    signal_simple_error ("Shared library does not define `emacs_initialize'",
+                        library);
+  (*function) ();
+
+  return Qnil;
+}
+
+void syms_of_dll ()
+{
+  DEFSUBR (Fdll_open);
+}
index edad0fc..5114354 100644 (file)
@@ -612,9 +612,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
   /* ralloc can only be used if using the GNU memory allocator. */
   init_ralloc ();
-#elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
-  if (initialized)
-    init_ralloc();
 #endif
 
 #ifdef HAVE_SOCKS
@@ -1281,6 +1278,9 @@ main_1 (int argc, char **argv, char **envp, int restart)
       vars_of_extents ();
       vars_of_faces ();
       vars_of_fileio ();
+#ifdef CLASH_DETECTION
+      vars_of_filelock ();
+#endif
       vars_of_floatfns ();
       vars_of_font_lock ();
       vars_of_frame ();
@@ -1535,6 +1535,10 @@ main_1 (int argc, char **argv, char **envp, int restart)
         might depend on all sorts of things; I'm not sure. */
       complex_vars_of_emacs ();
 
+#ifdef CLASH_DETECTION
+      complex_vars_of_filelock ();
+#endif /* CLASH_DETECTION */
+
       /* This creates a couple of basic keymaps and depends on Lisp
         hashtables and Ffset() (both of which depend on some variables
         initialized in the vars_of_*() section) and possibly other
index dc694dd..750055c 100644 (file)
@@ -1919,12 +1919,8 @@ complex_vars_of_faces (void)
                       inst_list);
 #endif /* HAVE_TTY */
 #ifdef HAVE_MS_WINDOWS
-    inst_list = Fcons (Fcons (list1 (Qmswindows),
-                      build_string ("Fixedsys:Regular:9::Western")), inst_list);
-    inst_list = Fcons (Fcons (list1 (Qmswindows),
-                      build_string ("Courier:Regular:10::Western")), inst_list);
-    inst_list = Fcons (Fcons (list1 (Qmswindows),
-                      build_string ("Courier New:Regular:10::Western")), inst_list);
+    inst_list = Fcons (Fcons (list1 (Qmswindows), build_string ("Courier New")),
+                      inst_list);
 #endif /* HAVE_MS_WINDOWS */
     set_specifier_fallback (Fget (Vdefault_face, Qfont, Qnil), inst_list);
   }
index bc4cc9e..22cba39 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -1688,7 +1688,7 @@ the value of `foo'.
       REGISTER Lisp_Object elt, tem;
       CONCHECK_CONS (tail);
       elt = XCAR (tail);
-      if (CONSP (elt) && (tem = XCDR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
+      if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
        {
          if (NILP (prev))
            list = XCDR (tail);
@@ -1715,7 +1715,7 @@ remrassq_no_quit (Lisp_Object value, Lisp_Object list)
     {
       REGISTER Lisp_Object elt, tem;
       elt = XCAR (tail);
-      if (CONSP (elt) && (tem = XCDR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
+      if (CONSP (elt) && (tem = XCAR (elt), EQ_WITH_EBOLA_NOTICE (value, tem)))
        {
          if (NILP (prev))
            list = XCDR (tail);
diff --git a/src/gdbinit b/src/gdbinit
new file mode 100644 (file)
index 0000000..162b641
--- /dev/null
@@ -0,0 +1,421 @@
+# -*- ksh -*-
+# Copyright (C) 1998 Free Software Foundation, Inc.
+
+# This file is part of XEmacs.
+
+# XEmacs 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.
+
+# XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Author: Martin Buchholz
+
+# Some useful commands for debugging emacs with gdb 4.16 or better.
+# Install this as your .gdbinit file in your home directory,
+# or source this file from your .gdbinit
+# Configure xemacs with --debug, and compile with -g.
+#
+# See also the question of the XEmacs FAQ, titled
+# "How to Debug an XEmacs problem with a debugger".
+#
+# This can be used to debug XEmacs no matter how the following are
+# specified:
+
+# USE_UNION_TYPE
+# USE_MINIMAL_TAGBITS
+# USE_INDEXED_LRECORD_IMPLEMENTATION
+# LRECORD_(SYMBOL|STRING|VECTOR)
+
+# (the above all have configure equivalents)
+
+# Some functions defined here require a running process, but most
+# don't.  Considerable effort has been expended to this end.
+
+# See the dbg_ C support code in src/alloc.c that allows the functions
+# defined in this file to work correctly.
+
+set print union off
+set print pretty off
+
+define decode_object
+  set $obj = (unsigned long) $arg0
+  if dbg_USE_MINIMAL_TAGBITS
+    if $obj & 1
+    # It's an int
+      set $val = $obj >> 1
+      set $type = dbg_Lisp_Type_Int
+    else
+      set $type = $obj & dbg_typemask
+      if $type == dbg_Lisp_Type_Char
+        set $val = ($obj & dbg_valmask) >> dbg_gctypebits
+      else
+        # It's a record pointer
+        set $val = $obj
+      end
+    end
+  else
+    # not dbg_USE_MINIMAL_TAGBITS
+    set $val = $obj & dbg_valmask
+    set $type = ($obj & dbg_typemask) >> (dbg_valbits + 1)
+  end
+
+  if $type == dbg_Lisp_Type_Record
+    set $lheader = (struct lrecord_header *) $val
+    if dbg_USE_INDEXED_LRECORD_IMPLEMENTATION
+      set $imp = lrecord_implementations_table[$lheader->type]
+    else
+      set $imp = $lheader->implementation
+    end
+  else
+    set $imp = -1
+  end
+end
+
+document decode_object
+Usage: decode_object lisp_object
+Extract implementation information from a Lisp Object.
+Defines variables $val, $type and $imp.
+end
+
+define xint
+decode_object $arg0
+print ((long) $val)
+end
+
+define xtype
+  decode_object $arg0
+  if $type == dbg_Lisp_Type_Int
+    echo int\n
+  else
+  if $type == dbg_Lisp_Type_Char
+    echo char\n
+  else
+  if $type == dbg_Lisp_Type_Symbol
+    echo symbol\n
+  else
+  if $type == dbg_Lisp_Type_String
+    echo string\n
+  else
+  if $type == dbg_Lisp_Type_Vector
+    echo vector\n
+  else
+  if $type == dbg_Lisp_Type_Cons
+    echo cons\n
+  else
+    printf "record type: %s\n", $imp->name
+  # barf
+  end
+  end
+  end
+  end
+  end
+  end
+end
+
+define run-temacs
+  unset env EMACSLOADPATH
+  set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+  run -batch -l ../lisp/loadup.el run-temacs -q
+end
+
+document run-temacs
+Usage: run-temacs
+Run temacs interactively, like xemacs.
+Use this with debugging tools (like purify) that cannot deal with dumping,
+or when temacs builds successfully, but xemacs does not.
+end
+
+define update-elc
+  unset env EMACSLOADPATH
+  set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+  run -batch -l ../lisp/update-elc.el
+end
+
+document update-elc
+Usage: update-elc
+Run the core lisp byte compilation part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+define dump-temacs
+  unset env EMACSLOADPATH
+  set env EMACSBOOTSTRAPLOADPATH ../lisp/:..
+  run -batch -l ../lisp/loadup.el dump
+end
+
+document dump-temacs
+Usage: dump-temacs
+Run the dumping part of the build procedure.
+Use when debugging temacs, not xemacs!
+Use this when temacs builds successfully, but xemacs does not.
+end
+
+# if you use Purify, do this:
+# export PURIFYOPTIONS='-pointer-mask=0x0fffffff'
+
+define ldp
+  printf "%s", "Lisp => "
+  call debug_print($arg0)
+end
+
+document ldp
+Usage: ldp lisp_object
+Print a Lisp Object value using the Lisp printer.
+Requires a running xemacs process.
+end
+
+define lbt
+call debug_backtrace()
+end
+
+document lbt
+Usage: lbt
+Print the current Lisp stack trace.
+Requires a running xemacs process.
+end
+
+define wtype
+print $arg0->core.widget_class->core_class.class_name
+end
+
+define xtname
+print XrmQuarkToString(((Object)($arg0))->object.xrm_name)
+end
+
+# GDB's command language makes you want to ...
+
+define pstruct
+  set $xstruct = (struct $arg0 *) $val
+  print $xstruct
+  print *$xstruct
+end
+
+define pobj
+  decode_object $arg0
+  if $type == dbg_Lisp_Type_Int
+    printf "Integer: %d\n", $val
+  else
+  if $type == dbg_Lisp_Type_Char
+    if $val < 128
+      printf "Char: %c\n", $val
+    else
+      printf "Char: %d\n", $val
+    end
+  else
+  if $type == dbg_Lisp_Type_String || $imp == lrecord_string
+    pstruct Lisp_String
+  else
+  if $type == dbg_Lisp_Type_Cons   || $imp == lrecord_cons
+    pstruct Lisp_Cons
+  else
+  if $type == dbg_Lisp_Type_Symbol || $imp == lrecord_symbol
+    pstruct Lisp_Symbol
+    printf "Symbol name: %s\n", $xstruct->name->_data
+  else
+  if $type == dbg_Lisp_Type_Vector || $imp == lrecord_vector
+    pstruct Lisp_Vector
+    printf "Vector of length %d\n", $xstruct->size
+    #print *($xstruct->_data) @ $xstruct->size
+  else
+  if $imp == lrecord_bit_vector
+    pstruct Lisp_Bit_Vector
+  else
+  if $imp == lrecord_buffer
+    pstruct buffer
+  else
+  if $imp == lrecord_char_table
+    pstruct Lisp_Char_Table
+  else
+  if $imp == lrecord_char_table_entry
+    pstruct Lisp_Char_Table_Entry
+  else
+  if $imp == lrecord_charset
+    pstruct Lisp_Charset
+  else
+  if $imp == lrecord_coding_system
+    pstruct Lisp_Coding_System
+  else
+  if $imp == lrecord_color_instance
+    pstruct Lisp_Color_Instance
+  else
+  if $imp == lrecord_command_builder
+    pstruct command_builder
+  else
+  if $imp == lrecord_compiled_function
+    pstruct Lisp_Compiled_Function
+  else
+  if $imp == lrecord_console
+    pstruct console
+  else
+  if $imp == lrecord_database
+    pstruct database
+  else
+  if $imp == lrecord_device
+    pstruct device
+  else
+  if $imp == lrecord_event
+    pstruct Lisp_Event
+  else
+  if $imp == lrecord_extent
+    pstruct extent
+  else
+  if $imp == lrecord_extent_auxiliary
+    pstruct extent_auxiliary
+  else
+  if $imp == lrecord_extent_info
+    pstruct extent_info
+  else
+  if $imp == lrecord_face
+    pstruct Lisp_Face
+  else
+  if $imp == lrecord_float
+    pstruct Lisp_Float
+  else
+  if $imp == lrecord_font_instance
+    pstruct Lisp_Font_Instance
+  else
+  if $imp == lrecord_frame
+    pstruct frame
+  else
+  if $imp == lrecord_glyph
+    pstruct Lisp_Glyph
+  else
+  if $imp == lrecord_hashtable
+    pstruct hashtable
+  else
+  if $imp == lrecord_image_instance
+    pstruct Lisp_Image_Instance
+  else
+  if $imp == lrecord_keymap
+    pstruct keymap
+  else
+  if $imp == lrecord_lcrecord_list
+    pstruct lcrecord_list
+  else
+  if $imp == lrecord_lstream
+    pstruct lstream
+  else
+  if $imp == lrecord_marker
+    pstruct Lisp_Marker
+  else
+  if $imp == lrecord_opaque
+    pstruct Lisp_Opaque
+  else
+  if $imp == lrecord_opaque_list
+    pstruct Lisp_Opaque_List
+  else
+  if $imp == lrecord_popup_data
+    pstruct popup_data
+  else
+  if $imp == lrecord_process
+    pstruct Lisp_Process
+  else
+  if $imp == lrecord_range_table
+    pstruct Lisp_Range_Table
+  else
+  if $imp == lrecord_specifier
+    pstruct Lisp_Specifier
+  else
+  if $imp == lrecord_subr
+    pstruct Lisp_Subr
+  else
+  if $imp == lrecord_symbol_value_buffer_local
+    pstruct symbol_value_buffer_local
+  else
+  if $imp == lrecord_symbol_value_forward
+    pstruct symbol_value_forward
+  else
+  if $imp == lrecord_symbol_value_lisp_magic
+    pstruct symbol_value_lisp_magic
+  else
+  if $imp == lrecord_symbol_value_varalias
+    pstruct symbol_value_varalias
+  else
+  if $imp == lrecord_toolbar_button
+    pstruct toolbar_button
+  else
+  if $imp == lrecord_tooltalk_message
+    pstruct Lisp_Tooltalk_Message
+  else
+  if $imp == lrecord_tooltalk_pattern
+    pstruct Lisp_Tooltalk_Pattern
+  else
+  if $imp == lrecord_weak_list
+    pstruct weak_list
+  else
+  if $imp == lrecord_window
+    pstruct window
+  else
+  if $imp == lrecord_window_configuration
+    pstruct window_config
+  else
+    echo Unknown Lisp Object type\n
+    print $arg0
+  # Barf, gag, retch
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+  end
+end
+
+document pobj
+Usage: pobj lisp_object
+Print the internal C structure of a underlying Lisp Object.
+end
index bd1fcd7..c4daa12 100644 (file)
@@ -49,7 +49,6 @@ Boston, MA 02111-1307, USA.  */
 #include "lstream.h"
 #include "console.h"
 #include "device.h"
-#include "faces.h"
 #include "glyphs.h"
 #include "objects.h"
 
@@ -517,7 +516,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
  *                               GIF                                  *
  **********************************************************************/
 
-#include "gifrlib.h"
+#include <gifrlib.h>
 
 static void
 gif_validate (Lisp_Object instantiator)
@@ -698,12 +697,8 @@ gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
     eip = unwind.eimage;
     for (i = 0; i < height; i++)
       {
-       if (interlace)
-         if (row >= height) {
-           row = InterlacedOffset[++pass];
-           while (row > height) 
-             row = InterlacedOffset[++pass];
-         }
+       if (interlace && row >= height)
+         row = InterlacedOffset[++pass];
        eip = unwind.eimage + (row * width * 3);
        for (j = 0; j < width; j++)
          {
@@ -817,8 +812,6 @@ png_instantiate_unwind (Lisp_Object unwind_obj)
   if (data->instream)
     fclose (data->instream);
 
-  if (data->eimage) xfree(data->eimage);
-
   return Qnil;
 }
 
@@ -909,42 +902,6 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
     for (y = 0; y < height; y++)
       row_pointers[y] = unwind.eimage + (width * 3 * y);
 
-    {
-      /* if the png specifies a background chunk, go ahead and
-        use it, else use what we can get from the default face. */
-      png_color_16 my_background, *image_background;
-      Lisp_Object bkgd = Qnil;
-
-      my_background.red   = 0x7fff;
-      my_background.green = 0x7fff;
-      my_background.blue  = 0x7fff;
-      bkgd = FACE_BACKGROUND (Vdefault_face, domain);
-      if (!COLOR_INSTANCEP (bkgd))
-       {
-         warn_when_safe (Qpng, Qinfo, "Couldn't get background color!");
-       }
-      else
-       {
-         struct Lisp_Color_Instance *c;
-         Lisp_Object rgblist;
-
-         c = XCOLOR_INSTANCE (bkgd);
-         rgblist = MAYBE_LISP_DEVMETH (XDEVICE (c->device),
-                                       color_instance_rgb_components,
-                                       (c));
-         my_background.red = XINT (XCAR (rgblist));
-         my_background.green = XINT (XCAR (XCDR (rgblist)));
-         my_background.blue = XINT (XCAR (XCDR (XCDR (rgblist))));
-       }
-      
-      if (png_get_bKGD (png_ptr, info_ptr, &image_background))
-       png_set_background (png_ptr, image_background,
-                           PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
-      else 
-       png_set_background (png_ptr, &my_background,
-                           PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-    }
-
     /* Now that we're using EImage, ask for 8bit RGB triples for any type
        of image*/
     /* convert palatte images to full RGB */
@@ -957,6 +914,12 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
     /* we can't handle alpha values */
     if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
       png_set_strip_alpha (png_ptr);
+    /* rip out any transparancy layers/colors */
+    if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
+      {
+        png_set_expand (png_ptr);
+       png_set_strip_alpha (png_ptr);
+      }
     /* tell libpng to strip 16 bit depth files down to 8 bits */
     if (info_ptr->bit_depth == 16)
       png_set_strip_16 (png_ptr);
@@ -969,6 +932,25 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
          png_set_packing (png_ptr);
       }
 
+#if 1 /* tests? or permanent? */
+    {
+      /* if the png specifies a background chunk, go ahead and
+        use it */
+      png_color_16 my_background, *image_background;
+    
+      /* ### how do I get the background of the current frame? */
+      my_background.red   = 0x7fff;
+      my_background.green = 0x7fff;
+      my_background.blue  = 0x7fff;
+
+      if (png_get_bKGD (png_ptr, info_ptr, &image_background))
+       png_set_background (png_ptr, image_background,
+                           PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+      else 
+       png_set_background (png_ptr, &my_background,
+                           PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+    }
+#endif
     png_read_image (png_ptr, row_pointers);
     png_read_end (png_ptr, info_ptr);
     
index 86f2cb1..b481ce8 100644 (file)
@@ -2366,17 +2366,15 @@ pairs.  FORMAT should be one of
   instanced as `mono-pixmap', `color-pixmap', or `pointer'.)
 'gif
   (A GIF87 or GIF89 image; only if GIF support was compiled into this
-   XEmacs.  NOTE: only the first frame of animated gifs will be displayed.
-   Can be instanced as `color-pixmap'.)
+   XEmacs.  Can be instanced as `color-pixmap'.)
 'jpeg
   (A JPEG image; only if JPEG support was compiled into this XEmacs.
    Can be instanced as `color-pixmap'.)
 'png
-  (A PNG image; only if PNG support was compiled into this XEmacs.
+  (A PNG/GIF24 image; only if PNG support was compiled into this XEmacs.
    Can be instanced as `color-pixmap'.)
 'tiff
-  (A TIFF image; only if TIFF support was compiled into this XEmacs.
-   Can be instanced as `color-pixmap'.)
+  (A TIFF image; not currently implemented.)
 'cursor-font
   (One of the standard cursor-font names, such as "watch" or
    "right_ptr" under X.  Under X, this is, more specifically, any
diff --git a/src/input-method-xfs.c b/src/input-method-xfs.c
new file mode 100644 (file)
index 0000000..ed9cd6d
--- /dev/null
@@ -0,0 +1,86 @@
+/* input-method-xfs.c provides just only locale initialize
+   for non Motif people. (stoled from input-method-xlib.c)
+   Why I made this code is to initialize X locale environment for
+   the purpose of use XFontSet correctly in lwlib/xlwmenu.c.
+   And this code donot provides input methods under Xlib while they
+   prefer to use Canna, Wnn, skk or something like that.
+   This code has been tested on FreeBSD 2.2.1 and Solaris2.5.
+
+   Copyright (C) 1997 Kazuyuki IENAGA.
+
+This file is a part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; 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 <X11/Xlocale.h>        /* More portable than <locale.h> ? */
+#include "lisp.h"
+#include "frame.h"
+#include "device.h"
+#include "window.h"
+#include "buffer.h"
+#include "console-x.h"
+#include "EmacsFrame.h"
+#include "events.h"
+
+#ifdef USE_XFONTSET
+void
+Initialize_Locale (void)
+{
+  char *locale;
+
+  XtSetLanguageProc (NULL, (XtLanguageProc) NULL, NULL);
+  if ((locale = setlocale (LC_ALL, "")) == NULL)
+    {
+      stderr_out ("Can't set locale.\n");
+      stderr_out ("Using C locale instead.\n");
+      putenv ("LANG=C");
+      putenv ("LC_ALL=C");
+      if ((locale = setlocale (LC_ALL, "C")) == NULL)
+       {
+         stderr_out ("Can't even set locale to `C'!\n");
+         return;
+       }
+    }
+
+  if (!XSupportsLocale ())
+    {
+      stderr_out ("X Windows does not support locale `%s'\n", locale);
+      stderr_out ("Using C Locale instead\n");
+      putenv ("LANG=C");
+      putenv ("LC_ALL=C");
+      if ((locale = setlocale (LC_ALL, "C")) == NULL)
+       {
+         stderr_out ("Can't even set locale to `C'!\n");
+         return;
+       }
+      if (!XSupportsLocale ())
+        {
+          stderr_out ("X Windows does not even support locale `C'!\n");
+          return;
+        }
+    }
+
+  setlocale(LC_NUMERIC, "C");
+  setlocale(LC_CTYPE, ""); /* take back CTYPE to previous state */
+  
+  if (XSetLocaleModifiers ("") == NULL)
+    {
+      stderr_out ("XSetLocaleModifiers(\"\") failed\n");
+      stderr_out ("Check the value of the XMODIFIERS environment variable.\n");
+    }
+}
+#endif /* USE_XFONTSET */
index f516263..01484b7 100644 (file)
@@ -1657,8 +1657,6 @@ gap_left (struct buffer *buf, Bytind pos)
   Bufbyte *to, *from;
   Bytecount i;
   Bytind new_s1;
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
 
   from = BUF_GPT_ADDR (buf);
   to = from + BUF_GAP_SIZE (buf);
@@ -1710,22 +1708,13 @@ gap_left (struct buffer *buf, Bytind pos)
   /* Adjust markers, and buffer data structure, to put the gap at POS.
      POS is where the loop above stopped, which may be what was specified
      or may be where a quit was detected.  */
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      adjust_markers (mbuf, pos, BI_BUF_GPT (mbuf), BUF_GAP_SIZE (mbuf));
-    }
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      adjust_extents (make_buffer (mbuf), pos, BI_BUF_GPT (mbuf),
-                     BUF_GAP_SIZE (mbuf));
-    }
+  adjust_markers (buf, pos, BI_BUF_GPT (buf), BUF_GAP_SIZE (buf));
+  adjust_extents (make_buffer (buf), pos, BI_BUF_GPT (buf),
+                 BUF_GAP_SIZE (buf));
   SET_BI_BUF_GPT (buf, pos);
   SET_GAP_SENTINEL (buf);
 #ifdef ERROR_CHECK_EXTENTS
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      sledgehammer_extent_check (make_buffer (mbuf));
-    }
+  sledgehammer_extent_check (make_buffer (buf));
 #endif
   QUIT;
 }
@@ -1736,8 +1725,6 @@ gap_right (struct buffer *buf, Bytind pos)
   Bufbyte *to, *from;
   Bytecount i;
   Bytind new_s1;
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
 
   to = BUF_GPT_ADDR (buf);
   from = to + BUF_GAP_SIZE (buf);
@@ -1788,22 +1775,13 @@ gap_right (struct buffer *buf, Bytind pos)
 
   {
     int gsize = BUF_GAP_SIZE (buf);
-    MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-      {
-       adjust_markers (mbuf, BI_BUF_GPT (mbuf) + gsize, pos + gsize, - gsize);
-      }
-    MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-      {
-       adjust_extents (make_buffer (mbuf), BI_BUF_GPT (mbuf) + gsize,
-                       pos + gsize, - gsize);
-      }
+    adjust_markers (buf, BI_BUF_GPT (buf) + gsize, pos + gsize, - gsize);
+    adjust_extents (make_buffer (buf), BI_BUF_GPT (buf) + gsize, pos + gsize,
+                   - gsize);
     SET_BI_BUF_GPT (buf, pos);
     SET_GAP_SENTINEL (buf);
 #ifdef ERROR_CHECK_EXTENTS
-    MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-      {
-       sledgehammer_extent_check (make_buffer (mbuf));
-      }
+    sledgehammer_extent_check (make_buffer (buf));
 #endif
   }
   if (pos == BI_BUF_Z (buf))
@@ -2102,10 +2080,8 @@ static int inside_change_hook;
 static Lisp_Object
 change_function_restore (Lisp_Object buffer)
 {
-  /* We should first reset the variable and then change the buffer,
-     because Fset_buffer() can throw.  */
-  inside_change_hook = 0;
   Fset_buffer (buffer);
+  inside_change_hook = 0;
   return Qnil;
 }
 
@@ -2114,8 +2090,8 @@ static int in_first_change;
 static Lisp_Object
 first_change_hook_restore (Lisp_Object buffer)
 {
-  in_first_change = 0;
   Fset_buffer (buffer);
+  in_first_change = 0;
   return Qnil;
 }
 
@@ -2130,7 +2106,8 @@ signal_first_change (struct buffer *buf)
 
   if (!in_first_change)
     {
-      if (!NILP (symbol_value_in_buffer (Qfirst_change_hook, buffer)))
+      if (!preparing_for_armageddon &&
+         !NILP (symbol_value_in_buffer (Qfirst_change_hook, buffer)))
        {
          int speccount = specpdl_depth ();
          record_unwind_protect (first_change_hook_restore, buffer);
@@ -2149,13 +2126,11 @@ static void
 signal_before_change (struct buffer *buf, Bufpos start, Bufpos end)
 {
   /* This function can GC */
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
+  Lisp_Object buffer;
+  XSETBUFFER (buffer, buf);
 
   if (!inside_change_hook)
     {
-      Lisp_Object buffer;
-
       /* Are we in a multiple-change session? */
       if (buf->text->changes->in_multiple_change &&
          buf->text->changes->mc_begin != 0)
@@ -2184,46 +2159,35 @@ signal_before_change (struct buffer *buf, Bufpos start, Bufpos end)
 
       /* If buffer is unmodified, run a special hook for that case.  */
       if (BUF_SAVE_MODIFF (buf) >= BUF_MODIFF (buf))
-       {
-         MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-           {
-             signal_first_change (mbuf);
-           }
-       }
+       signal_first_change (buf);
 
       /* Now in any case run the before-change-functions if any.  */
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+      if (!preparing_for_armageddon &&
+         (!NILP (symbol_value_in_buffer (Qbefore_change_functions, buffer)) ||
+          /* Obsolete, for compatibility */
+          !NILP (symbol_value_in_buffer (Qbefore_change_function, buffer))))
        {
-         XSETBUFFER (buffer, mbuf);
-         if (!NILP (symbol_value_in_buffer (Qbefore_change_functions, buffer))
-             /* Obsolete, for compatibility */
-             || !NILP (symbol_value_in_buffer (Qbefore_change_function, buffer)))
-           {
-             int speccount = specpdl_depth ();
-             record_unwind_protect (change_function_restore, Fcurrent_buffer ());
-             set_buffer_internal (buf);
-             inside_change_hook = 1;
-             va_run_hook_with_args (Qbefore_change_functions, 2,
-                                    make_int (start), make_int (end));
-             /* Obsolete, for compatibility */
-             va_run_hook_with_args (Qbefore_change_function, 2,
-                                    make_int (start), make_int (end));
-             unbind_to (speccount, Qnil);
-           }
-       }
-
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         XSETBUFFER (buffer, mbuf);
-         report_extent_modification (buffer, start, end,
-                                     &inside_change_hook, 0);
+         int speccount = specpdl_depth ();
+         record_unwind_protect (change_function_restore, Fcurrent_buffer ());
+         set_buffer_internal (buf);
+         inside_change_hook = 1;
+         va_run_hook_with_args (Qbefore_change_functions, 2,
+                                make_int (start), make_int (end));
+         /* Obsolete, for compatibility */
+         va_run_hook_with_args (Qbefore_change_function, 2,
+                                make_int (start), make_int (end));
+         unbind_to (speccount, Qnil);
        }
 
       /* Only now do we indicate that the before-change-functions have
         been called, in case some function throws out. */
       buf->text->changes->mc_begin_signaled = 1;
     }
+
+  /* #### At this point we should map over extents calling
+     modification-hooks, insert-before-hooks and insert-after-hooks
+     of relevant extents */
 }
 
 /* Signal a change immediately after it happens.
@@ -2237,25 +2201,15 @@ signal_after_change (struct buffer *buf, Bufpos start, Bufpos orig_end,
                     Bufpos new_end)
 {
   /* This function can GC */
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
+  Lisp_Object buffer;
+  XSETBUFFER (buffer, buf);
 
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      /* always do this. */
-      buffer_signal_changed_region (mbuf, start, new_end);
-    }
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      /* #### This seems inefficient.  Wouldn't it be better to just
-         keep one cache per base buffer?  */
-      font_lock_maybe_update_syntactic_caches (mbuf, start, orig_end, new_end);
-    }
+  /* always do this. */
+  buffer_signal_changed_region (buf, start, new_end);
+  font_lock_maybe_update_syntactic_caches (buf, start, orig_end, new_end);
 
   if (!inside_change_hook)
     {
-      Lisp_Object buffer;
-
       if (buf->text->changes->in_multiple_change &&
          buf->text->changes->mc_begin != 0)
        {
@@ -2267,38 +2221,30 @@ signal_after_change (struct buffer *buf, Bufpos start, Bufpos orig_end,
          return; /* after-change-functions signalled when all changes done */
        }
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         XSETBUFFER (buffer, mbuf);
-
-         if (!NILP (symbol_value_in_buffer (Qafter_change_functions, buffer))
-             /* Obsolete, for compatibility */
-             || !NILP (symbol_value_in_buffer (Qafter_change_function, buffer)))
-           {
-             int speccount = specpdl_depth ();
-             record_unwind_protect (change_function_restore, Fcurrent_buffer ());
-             set_buffer_internal (buf);
-             inside_change_hook = 1;
-             /* The actual after-change functions take slightly
-                different arguments than what we were passed. */
-             va_run_hook_with_args (Qafter_change_functions, 3,
-                                    make_int (start), make_int (new_end),
-                                    make_int (orig_end - start));
-             /* Obsolete, for compatibility */
-             va_run_hook_with_args (Qafter_change_function, 3,
-                                    make_int (start), make_int (new_end),
-                                    make_int (orig_end - start));
-             unbind_to (speccount, Qnil);
-           }
-       }
-
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+      if (!preparing_for_armageddon &&
+         (!NILP (symbol_value_in_buffer (Qafter_change_functions, buffer)) ||
+          /* Obsolete, for compatibility */
+          !NILP (symbol_value_in_buffer (Qafter_change_function, buffer))))
        {
-         XSETBUFFER (buffer, mbuf);
-         report_extent_modification (buffer, start, new_end,
-                                     &inside_change_hook, 1);
+         int speccount = specpdl_depth ();
+         record_unwind_protect (change_function_restore, Fcurrent_buffer ());
+         set_buffer_internal (buf);
+         inside_change_hook = 1;
+         /* The actual after-change functions take slightly
+            different arguments than what we were passed. */
+         va_run_hook_with_args (Qafter_change_functions, 3,
+                                make_int (start), make_int (new_end),
+                                make_int (orig_end - start));
+         /* Obsolete, for compatibility */
+         va_run_hook_with_args (Qafter_change_function, 3,
+                                make_int (start), make_int (new_end),
+                                make_int (orig_end - start));
+         unbind_to (speccount, Qnil);
        }
     }
+
+  /* #### At this point we should map over extents calling
+     some sort of modification hooks of relevant extents */
 }
 
 /* Call this if you're about to change the region of BUFFER from START
@@ -2314,14 +2260,10 @@ prepare_to_modify_buffer (struct buffer *buf, Bufpos start, Bufpos end,
   /* dmoore - This function can also kill the buffer buf, the current
      buffer, and do anything it pleases.  So if you call it, be
      careful. */
-  struct buffer *mbuf;
-  Lisp_Object buffer, bufcons;
+  Lisp_Object buffer;
   struct gcpro gcpro1;
 
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      barf_if_buffer_read_only (mbuf, start, end);
-    }
+  barf_if_buffer_read_only (buf, start, end);
 
   /* if this is the first modification, see about locking the buffer's
      file */
@@ -2365,10 +2307,7 @@ prepare_to_modify_buffer (struct buffer *buf, Bufpos start, Bufpos end,
   Vdeactivate_mark = Qt;
 #endif
 
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      mbuf->point_before_scroll = Qnil;
-    }
+  buf->point_before_scroll = Qnil;
 }
 
 \f
@@ -2428,8 +2367,6 @@ buffer_insert_string_1 (struct buffer *buf, Bufpos pos,
   Bytind ind;
   Charcount cclen;
   int move_point = 0;
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
 
   /* Defensive steps just in case a buffer gets deleted and a calling
      function doesn't notice it. */
@@ -2454,8 +2391,7 @@ buffer_insert_string_1 (struct buffer *buf, Bufpos pos,
   if ((length + BUF_Z (buf)) > EMACS_INT_MAX)
     error ("Maximum buffer size exceeded");
 
-  /* theoretically not necessary -- caller should GCPRO.
-     #### buffer_insert_from_buffer_1() doesn't!  */
+  /* theoretically not necessary -- caller should GCPRO */
   GCPRO1 (reloc);
 
   prepare_to_modify_buffer (buf, pos, pos, !(flags & INSDEL_NO_LOCKING));
@@ -2497,11 +2433,7 @@ buffer_insert_string_1 (struct buffer *buf, Bufpos pos,
 
   insert_invalidate_line_number_cache (buf, pos, nonreloc + offset, length);
 
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      record_insert (mbuf, pos, cclen);
-    }
-
+  record_insert (buf, pos, cclen);
   BUF_MODIFF (buf)++;
   MARK_BUFFERS_CHANGED;
 
@@ -2513,10 +2445,7 @@ buffer_insert_string_1 (struct buffer *buf, Bufpos pos,
 
   SET_BUF_GAP_SIZE (buf, BUF_GAP_SIZE (buf) - length);
   SET_BI_BUF_GPT (buf, BI_BUF_GPT (buf) + length);
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) + cclen, BI_BUF_ZV (mbuf) + length);
-    }
+  SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) + cclen, BI_BUF_ZV (buf) + length);
   SET_BOTH_BUF_Z (buf, BUF_Z (buf) + cclen, BI_BUF_Z (buf) + length);
   SET_GAP_SENTINEL (buf);
 
@@ -2524,48 +2453,29 @@ buffer_insert_string_1 (struct buffer *buf, Bufpos pos,
   buffer_mule_signal_inserted_region (buf, pos, length, cclen);
 #endif
 
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      process_extents_for_insertion (make_buffer (mbuf), ind, length);
-    }
-
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      /* We know the gap is at IND so the cast is OK. */
-      adjust_markers_for_insert (mbuf, (Memind) ind, length);
-    }
+  process_extents_for_insertion (make_buffer (buf), ind, length);
+  /* We know the gap is at IND so the cast is OK. */
+  adjust_markers_for_insert (buf, (Memind) ind, length);
 
   /* Point logically doesn't move, but may need to be adjusted because
      it's a byte index.  point-marker doesn't change because it's a
      memory index. */
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      if (BI_BUF_PT (mbuf) > ind)
-       JUST_SET_POINT (mbuf, BUF_PT (mbuf) + cclen,
-                       BI_BUF_PT (mbuf) + length);
-    }
+  if (BI_BUF_PT (buf) > ind)
+    JUST_SET_POINT (buf, BUF_PT (buf) + cclen, BI_BUF_PT (buf) + length);
 
   /* Well, point might move. */
   if (move_point)
     BI_BUF_SET_PT (buf, ind + length);
 
   if (STRINGP (reloc))
-    {
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         splice_in_string_extents (reloc, mbuf, ind, length, offset);
-       }
-    }
+    splice_in_string_extents (reloc, buf, ind, length, offset);
 
   if (flags & INSDEL_BEFORE_MARKERS)
     {
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         /* ind - 1 is correct because the FROM argument is exclusive.
-            I formerly used DEC_BYTIND() but that caused problems at the
-            beginning of the buffer. */
-         adjust_markers (mbuf, ind - 1, ind, length);
-       }
+      /* ind - 1 is correct because the FROM argument is exclusive.
+        I formerly used DEC_BYTIND() but that caused problems at the
+        beginning of the buffer. */
+      adjust_markers (buf, ind - 1, ind, length);
     }
 
   signal_after_change (buf, pos, pos, pos + cclen);
@@ -2597,9 +2507,7 @@ buffer_insert_lisp_string_1 (struct buffer *buf, Bufpos pos, Lisp_Object str,
                             int flags)
 {
   /* This function can GC */
-#ifdef ERROR_CHECK_TYPECHECK
   assert (STRINGP (str));
-#endif
   return buffer_insert_string_1 (buf, pos, 0, str, 0,
                                 XSTRING_LENGTH (str),
                                 flags);
@@ -2612,6 +2520,7 @@ buffer_insert_c_string_1 (struct buffer *buf, Bufpos pos, CONST char *s,
                          int flags)
 {
   /* This function can GC */
+
   CONST char *translated = GETTEXT (s);
   return buffer_insert_string_1 (buf, pos, (CONST Bufbyte *) translated, Qnil,
                                 0, strlen (translated), flags);
@@ -2623,7 +2532,9 @@ buffer_insert_emacs_char_1 (struct buffer *buf, Bufpos pos, Emchar ch,
 {
   /* This function can GC */
   Bufbyte str[MAX_EMCHAR_LEN];
-  Bytecount len = set_charptr_emchar (str, ch);
+  Bytecount len;
+
+  len = set_charptr_emchar (str, ch);
   return buffer_insert_string_1 (buf, pos, str, Qnil, 0, len, flags);
 }
 
@@ -2662,8 +2573,7 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
   Bytind bi_from, bi_to;
   Bytecount bc_numdel;
   EMACS_INT shortage;
-  struct buffer *mbuf;
-  Lisp_Object bufcons;
+  Lisp_Object bufobj;
 
   /* Defensive steps just in case a buffer gets deleted and a calling
      function doesn't notice it. */
@@ -2694,6 +2604,8 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
   if ((numdel = to - from) <= 0)
     return;
 
+  XSETBUFFER (bufobj, buf);
+
   /* Redisplay needs to know if a newline was in the deleted region.
      If we've already marked the changed region as having a deleted
      newline there is no use in performing the check. */
@@ -2701,12 +2613,7 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
     {
       scan_buffer (buf, '\n', from, to, 1, &shortage, 1);
       if (!shortage)
-       {
-         MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-           {
-             mbuf->changes->newline_was_deleted = 1;
-           }
-       }
+       buf->changes->newline_was_deleted = 1;
     }
 
   bi_from = bufpos_to_bytind (buf, from);
@@ -2720,70 +2627,49 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
     {
       /* avoid moving the gap just to delete from the bottom. */
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         record_delete (mbuf, from, numdel);
-       }
+      record_delete (buf, from, numdel);
       BUF_MODIFF (buf)++;
       MARK_BUFFERS_CHANGED;
 
-      /* #### Point used to be modified here, but this causes problems
-        with MULE, as point is used to calculate bytinds, and if the
-        offset in bc_numdel causes point to move to a non first-byte
-        location, causing some other function to throw an assertion
-        in ASSERT_VALID_BYTIND. I've moved the code to right after
-        the other movements and adjustments, but before the gap is
-        moved.  -- jh 970813 */
+      /* ### Point used to be modified here, but this causes problems with MULE,
+        as point is used to calculate bytinds, and if the offset in bc_numdel causes
+        point to move to a non first-byte location, causing some other function to
+        throw an assertion in ASSERT_VALID_BYTIND. I've moved the code to right after
+         the other movements and adjustments, but before the gap is moved.
+         -- jh 970813 */
 
       /* Detach any extents that are completely within the range [FROM, TO],
         if the extents are detachable.
 
-        This must come AFTER record_delete(), so that the appropriate
-        extents will be present to be recorded, and BEFORE the gap
-        size is increased, as otherwise we will be confused about
-        where the extents end. */
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         process_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to, 0);
-       }
+        This must come AFTER record_delete(), so that the appropriate extents
+        will be present to be recorded, and BEFORE the gap size is increased,
+        as otherwise we will be confused about where the extents end. */
+      process_extents_for_deletion (bufobj, bi_from, bi_to, 0);
 
-      /* Relocate all markers pointing into the new, larger gap to
-        point at the end of the text before the gap.  */
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         adjust_markers (mbuf,
-                         (bi_to + BUF_GAP_SIZE (mbuf)),
-                         (bi_to + BUF_GAP_SIZE (mbuf)),
-                         (- bc_numdel));
-       }
+      /* Relocate all markers pointing into the new, larger gap
+        to point at the end of the text before the gap.  */
+      adjust_markers (buf,
+                     (bi_to + BUF_GAP_SIZE (buf)),
+                     (bi_to + BUF_GAP_SIZE (buf)),
+                     (- bc_numdel));
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         /* Relocate any extent endpoints just like markers. */
-         adjust_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to,
-                                      BUF_GAP_SIZE (mbuf), bc_numdel, 0);
-       }
+      /* Relocate any extent endpoints just like markers. */
+      adjust_extents_for_deletion (bufobj, bi_from, bi_to,
+                                  BUF_GAP_SIZE (buf), bc_numdel, 0);
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+      /* Relocate point as if it were a marker.  */
+      if (bi_from < BI_BUF_PT (buf))
        {
-         /* Relocate point as if it were a marker.  */
-         if (bi_from < BI_BUF_PT (mbuf))
-           {
-             if (BI_BUF_PT (mbuf) < bi_to)
-               JUST_SET_POINT (mbuf, from, bi_from);
-             else
-               JUST_SET_POINT (mbuf, BUF_PT (mbuf) - numdel,
-                               BI_BUF_PT (mbuf) - bc_numdel);
-           }
+         if (BI_BUF_PT (buf) < bi_to)
+           JUST_SET_POINT (buf, from, bi_from);
+         else
+           JUST_SET_POINT (buf, BUF_PT (buf) - numdel,
+                           BI_BUF_PT (buf) - bc_numdel);
        }
 
       SET_BUF_END_GAP_SIZE (buf, BUF_END_GAP_SIZE (buf) + bc_numdel);
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) - numdel,
-                          BI_BUF_ZV (mbuf) - bc_numdel);
-       }
+      SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) - numdel, BI_BUF_ZV (buf) - bc_numdel);
       SET_BOTH_BUF_Z (buf, BUF_Z (buf) - numdel, BI_BUF_Z (buf) - bc_numdel);
       SET_GAP_SENTINEL (buf);
     }
@@ -2795,20 +2681,16 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
       if (bi_from > BI_BUF_GPT (buf))
        gap_right (buf, bi_from);
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         record_delete (mbuf, from, numdel);
-       }
+      record_delete (buf, from, numdel);
       BUF_MODIFF (buf)++;
       MARK_BUFFERS_CHANGED;
 
-      /* #### Point used to be modified here, but this causes problems
-        with MULE, as point is used to calculate bytinds, and if the
-        offset in bc_numdel causes point to move to a non first-byte
-        location, causing some other function to throw an assertion
-        in ASSERT_VALID_BYTIND. I've moved the code to right after
-        the other movements and adjustments, but before the gap is
-        moved.  -- jh 970813 */
+      /* ### Point used to be modified here, but this causes problems with MULE,
+        as point is used to calculate bytinds, and if the offset in bc_numdel causes
+        point to move to a non first-byte location, causing some other function to
+        throw an assertion in ASSERT_VALID_BYTIND. I've moved the code to right after
+         the other movements and adjustments, but before the gap is moved.
+         -- jh 970813 */
 
       /* Detach any extents that are completely within the range [FROM, TO],
         if the extents are detachable.
@@ -2816,48 +2698,31 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
         This must come AFTER record_delete(), so that the appropriate extents
         will be present to be recorded, and BEFORE the gap size is increased,
         as otherwise we will be confused about where the extents end. */
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         process_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to, 0);
-       }
+      process_extents_for_deletion (bufobj, bi_from, bi_to, 0);
 
-      /* Relocate all markers pointing into the new, larger gap to
-        point at the end of the text before the gap.  */
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         adjust_markers (mbuf,
-                         (bi_to + BUF_GAP_SIZE (mbuf)),
-                         (bi_to + BUF_GAP_SIZE (mbuf)),
-                         (- bc_numdel - BUF_GAP_SIZE (mbuf)));
-       }
+      /* Relocate all markers pointing into the new, larger gap
+        to point at the end of the text before the gap.  */
+      adjust_markers (buf,
+                     (bi_to + BUF_GAP_SIZE (buf)),
+                     (bi_to + BUF_GAP_SIZE (buf)),
+                     (- bc_numdel - BUF_GAP_SIZE (buf)));
 
       /* Relocate any extent endpoints just like markers. */
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         adjust_extents_for_deletion (make_buffer (mbuf), bi_from, bi_to,
-                                      BUF_GAP_SIZE (mbuf),
-                                      bc_numdel, BUF_GAP_SIZE (mbuf));
-       }
+      adjust_extents_for_deletion (bufobj, bi_from, bi_to, BUF_GAP_SIZE (buf),
+                                  bc_numdel, BUF_GAP_SIZE (buf));
 
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
+      /* Relocate point as if it were a marker.  */
+      if (bi_from < BI_BUF_PT (buf))
        {
-         /* Relocate point as if it were a marker.  */
-         if (bi_from < BI_BUF_PT (mbuf))
-           {
-             if (BI_BUF_PT (mbuf) < bi_to)
-               JUST_SET_POINT (mbuf, from, bi_from);
-             else
-               JUST_SET_POINT (mbuf, BUF_PT (mbuf) - numdel,
-                               BI_BUF_PT (mbuf) - bc_numdel);
-           }
+         if (BI_BUF_PT (buf) < bi_to)
+           JUST_SET_POINT (buf, from, bi_from);
+         else
+           JUST_SET_POINT (buf, BUF_PT (buf) - numdel,
+                           BI_BUF_PT (buf) - bc_numdel);
        }
 
       SET_BUF_GAP_SIZE (buf, BUF_GAP_SIZE (buf) + bc_numdel);
-      MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-       {
-         SET_BOTH_BUF_ZV (mbuf, BUF_ZV (mbuf) - numdel,
-                          BI_BUF_ZV (mbuf) - bc_numdel);
-       }
+      SET_BOTH_BUF_ZV (buf, BUF_ZV (buf) - numdel, BI_BUF_ZV (buf) - bc_numdel);
       SET_BOTH_BUF_Z (buf, BUF_Z (buf) - numdel, BI_BUF_Z (buf) - bc_numdel);
       SET_BI_BUF_GPT (buf, bi_from);
       SET_GAP_SENTINEL (buf);
@@ -2868,10 +2733,7 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
 #endif
 
 #ifdef ERROR_CHECK_EXTENTS
-  MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-    {
-      sledgehammer_extent_check (make_buffer (mbuf));
-    }
+  sledgehammer_extent_check (bufobj);
 #endif
 
   signal_after_change (buf, from, to, from);
@@ -2885,7 +2747,7 @@ buffer_delete_range (struct buffer *buf, Bufpos from, Bufpos to, int flags)
 /* Replace the character at POS in buffer B with CH. */
 
 void
-buffer_replace_char (struct buffer *buf, Bufpos pos, Emchar ch,
+buffer_replace_char (struct buffer *b, Bufpos pos, Emchar ch,
                     int not_real_change, int force_lock_check)
 {
   /* This function can GC */
@@ -2895,54 +2757,42 @@ buffer_replace_char (struct buffer *buf, Bufpos pos, Emchar ch,
 
   /* Defensive steps just in case a buffer gets deleted and a calling
      function doesn't notice it. */
-  if (!BUFFER_LIVE_P (buf))
+  if (!BUFFER_LIVE_P (b))
     return;
 
-  curlen = BUF_CHARPTR_COPY_CHAR (buf, pos, curstr);
+  curlen = BUF_CHARPTR_COPY_CHAR (b, pos, curstr);
   newlen = set_charptr_emchar (newstr, ch);
 
   if (curlen == newlen)
     {
-      struct buffer *mbuf;
-      Lisp_Object bufcons;
-
       /* then we can just replace the text. */
-      prepare_to_modify_buffer (buf, pos, pos + 1,
+      prepare_to_modify_buffer (b, pos, pos + 1,
                                !not_real_change || force_lock_check);
       /* Defensive steps in case the before-change-functions fuck around */
-      if (!BUFFER_LIVE_P (buf))
+      if (!BUFFER_LIVE_P (b))
        /* Bad bad pre-change function. */
        return;
 
       /* Make args be valid again.  prepare_to_modify_buffer() might have
         modified the buffer. */
-      if (pos < BUF_BEGV (buf))
-       pos = BUF_BEGV (buf);
-      if (pos >= BUF_ZV (buf))
-       pos = BUF_ZV (buf) - 1;
-      if (pos < BUF_BEGV (buf))
+      if (pos < BUF_BEGV (b))
+       pos = BUF_BEGV (b);
+      if (pos >= BUF_ZV (b))
+       pos = BUF_ZV (b) - 1;
+      if (pos < BUF_BEGV (b))
        /* no more characters in buffer! */
        return;
 
-      if (BUF_FETCH_CHAR (buf, pos) == '\n')
-       {
-         MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-           {
-             mbuf->changes->newline_was_deleted = 1;
-           }
-       }
+      if (BUF_FETCH_CHAR (b, pos) == '\n')
+       b->changes->newline_was_deleted = 1;
       MARK_BUFFERS_CHANGED;
       if (!not_real_change)
        {
-         MAP_INDIRECT_BUFFERS (buf, mbuf, bufcons)
-           {
-             record_change (mbuf, pos, 1);
-           }
-         BUF_MODIFF (buf)++;
+         record_change (b, pos, 1);
+         BUF_MODIFF (b)++;
        }
-      memcpy (BUF_BYTE_ADDRESS (buf, pos), newstr, newlen);
-
-      signal_after_change (buf, pos, pos + 1, pos + 1);
+      memcpy (BUF_BYTE_ADDRESS (b, pos), newstr, newlen);
+      signal_after_change (b, pos, pos + 1, pos + 1);
 
       /* We do not have to adjust the Mule data; we just replaced a
         character with another of the same number of bytes. */
@@ -2957,21 +2807,21 @@ buffer_replace_char (struct buffer *buf, Bufpos pos, Emchar ch,
        * point.  Point will drift backward by one position and stay
        * there otherwise.
        */
-      int movepoint = (pos == BUF_PT (buf) - 1);
+      int movepoint = (pos == BUF_PT (b) - 1);
 
-      buffer_delete_range (buf, pos, pos + 1, 0);
+      buffer_delete_range (b, pos, pos + 1, 0);
       /* Defensive steps in case the before-change-functions fuck around */
-      if (!BUFFER_LIVE_P (buf))
+      if (!BUFFER_LIVE_P (b))
        /* Bad bad pre-change function. */
        return;
 
       /* Make args be valid again.  prepare_to_modify_buffer() might have
         modified the buffer. */
-      if (pos < BUF_BEGV (buf))
-       pos = BUF_BEGV (buf);
-      if (pos >= BUF_ZV (buf))
-       pos = BUF_ZV (buf) - 1;
-      if (pos < BUF_BEGV (buf))
+      if (pos < BUF_BEGV (b))
+       pos = BUF_BEGV (b);
+      if (pos >= BUF_ZV (b))
+       pos = BUF_ZV (b) - 1;
+      if (pos < BUF_BEGV (b))
        /* no more characters in buffer! */
        return;
       /*
@@ -2979,7 +2829,7 @@ buffer_replace_char (struct buffer *buf, Bufpos pos, Emchar ch,
        * insertion, which we must do if the deletion moved point
        * backward so that it now equals the insertion point.
        */
-      buffer_insert_string_1 (buf, (movepoint ? -1 : pos),
+      buffer_insert_string_1 (b, (movepoint ? -1 : pos),
                              newstr, Qnil, 0, newlen, 0);
     }
 }
@@ -3235,9 +3085,9 @@ vars_of_insdel (void)
 }
 
 void
-init_buffer_text (struct buffer *b)
+init_buffer_text (struct buffer *b, int indirect_p)
 {
-  if (!b->base_buffer)
+  if (!indirect_p)
     {
       SET_BUF_GAP_SIZE (b, 20);
       BUFFER_ALLOC (b->text->beg, BUF_GAP_SIZE (b) + BUF_END_SENTINEL_SIZE);
@@ -3265,7 +3115,6 @@ init_buffer_text (struct buffer *b)
          }
       }
 #endif /* MULE */
-      b->text->line_number_cache = Qnil;
 
       BUF_MODIFF (b) = 1;
       BUF_SAVE_MODIFF (b) = 1;
@@ -3296,9 +3145,9 @@ init_buffer_text (struct buffer *b)
 }
 
 void
-uninit_buffer_text (struct buffer *b)
+uninit_buffer_text (struct buffer *b, int indirect_p)
 {
-  if (!b->base_buffer)
+  if (!indirect_p)
     {
       BUFFER_FREE (b->text->beg);
       xfree (b->text->changes);
index 8d7360e..d8a1f7f 100644 (file)
@@ -2689,7 +2689,6 @@ EXFUN (Fsymbol_function, 1);
 EXFUN (Fsymbol_name, 1);
 EXFUN (Fsymbol_plist, 1);
 EXFUN (Fsymbol_value, 1);
-EXFUN (Fsystem_name, 0);
 EXFUN (Fthrow, 2);
 EXFUN (Ftimes, MANY);
 EXFUN (Ftruncate, 1);
index 98516f0..9c0fa8b 100644 (file)
@@ -91,6 +91,9 @@ int load_warn_when_source_only;
 /* Whether Fload_internal() should ignore .elc files when no suffix is given */
 int load_ignore_elc_files;
 
+/* Directory in which the sources were found.  */
+Lisp_Object Vsource_directory;
+
 /* Search path for files to be loaded. */
 Lisp_Object Vload_path;
 
@@ -793,11 +796,10 @@ encoding detection or end-of-line detection.
   if (purify_flag && noninteractive)
     {
       if (EQ (last_file_loaded, file))
-       message_append (" (%ld)", 
-                       (unsigned long) (purespace_usage() - pure_usage));
+       message_append (" (%d)", purespace_usage() - pure_usage);
       else
-       message ("Loading %s ...done (%ld)", XSTRING_DATA (file),
-                (unsigned long) (purespace_usage() - pure_usage));
+       message ("Loading %s ...done (%d)", XSTRING_DATA (file),
+                purespace_usage() - pure_usage);
     }
 /*#endif / * DEBUG_XEMACS */
 
@@ -3151,6 +3153,12 @@ This is useful when the file being loaded is a temporary copy.
 */ );
   load_force_doc_strings = 0;
 
+  DEFVAR_LISP ("source-directory", &Vsource_directory /*
+Directory in which XEmacs sources were found when XEmacs was built.
+You cannot count on them to still be there!
+*/ );
+  Vsource_directory = Qnil;
+
   /* See read_escape().  */
 #if 0
   /* Used to be named `puke-on-fsf-keys' */
index 8b970e3..7ad6409 100644 (file)
@@ -169,21 +169,21 @@ extern char *jrKanjiError;
 static unsigned char buf[KEYTOSTRSIZE];
 static char **warning;
 
-static int canna_empty_info, canna_through_info;
-static int canna_underline;
-static int canna_inhibit_hankakukana;
+static int Vcanna_empty_info, Vcanna_through_info;
+static int Vcanna_underline;
+static int Vcanna_inhibit_hankakukana;
 
 static Lisp_Object Vcanna_kakutei_string;
 static Lisp_Object Vcanna_kakutei_yomi;
 static Lisp_Object Vcanna_kakutei_romaji;
 static Lisp_Object Vcanna_henkan_string;
-static int         canna_henkan_length;
-static int         canna_henkan_revPos;
-static int         canna_henkan_revLen;
+static int         Vcanna_henkan_length;
+static int         Vcanna_henkan_revPos;
+static int         Vcanna_henkan_revLen;
 static Lisp_Object Vcanna_ichiran_string;
-static int         canna_ichiran_length;
-static int         canna_ichiran_revPos;
-static int         canna_ichiran_revLen;
+static int         Vcanna_ichiran_length;
+static int         Vcanna_ichiran_revPos;
+static int         Vcanna_ichiran_revLen;
 static Lisp_Object Vcanna_mode_string;
 
 static int IRCP_context;
@@ -259,21 +259,21 @@ storeResults (unsigned char *buf, int len, jrKanjiStatus *ks)
        {
          Vcanna_henkan_string = make_string (ks->echoStr, ks->length);
 #ifndef CANNA_MULE
-         canna_henkan_length = ks->length;
-         canna_henkan_revPos = ks->revPos;
-         canna_henkan_revLen = ks->revLen;
+         Vcanna_henkan_length = ks->length;
+         Vcanna_henkan_revPos = ks->revPos;
+         Vcanna_henkan_revLen = ks->revLen;
 #else /* CANNA_MULE */
-         if (canna_underline)
+         if (Vcanna_underline)
            {
-             canna_henkan_length = mule_strlen (ks->echoStr,ks->length);
-             canna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos);
-             canna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen);
+             Vcanna_henkan_length = mule_strlen (ks->echoStr,ks->length);
+             Vcanna_henkan_revPos = mule_strlen (ks->echoStr,ks->revPos);
+             Vcanna_henkan_revLen = mule_strlen (ks->echoStr+ks->revPos,ks->revLen);
            }
          else
            {
              count_char (ks->echoStr, ks->length, ks->revPos, ks->revLen,
-                         &canna_henkan_length, &canna_henkan_revPos,
-                         &canna_henkan_revLen);
+                         &Vcanna_henkan_length, &Vcanna_henkan_revPos,
+                         &Vcanna_henkan_revLen);
            }
 #endif /* CANNA_MULE */
        }
@@ -284,13 +284,13 @@ storeResults (unsigned char *buf, int len, jrKanjiStatus *ks)
        {
          Vcanna_ichiran_string = make_string (ks->gline.line, ks->gline.length);
 #ifndef CANNA_MULE
-         canna_ichiran_length = ks->gline.length;
-         canna_ichiran_revPos = ks->gline.revPos;
-         canna_ichiran_revLen = ks->gline.revLen;
+         Vcanna_ichiran_length = ks->gline.length;
+         Vcanna_ichiran_revPos = ks->gline.revPos;
+         Vcanna_ichiran_revLen = ks->gline.revLen;
 #else /* CANNA_MULE */
          count_char (ks->gline.line, ks->gline.length,
-                     ks->gline.revPos, ks->gline.revLen, &canna_ichiran_length,
-                     &canna_ichiran_revPos, &canna_ichiran_revLen);
+                     ks->gline.revPos, ks->gline.revLen, &Vcanna_ichiran_length,
+                     &Vcanna_ichiran_revPos, &Vcanna_ichiran_revLen);
 #endif /* CANNA_MULE */
        }
 
@@ -302,8 +302,8 @@ storeResults (unsigned char *buf, int len, jrKanjiStatus *ks)
        }
 
       /* Â¤Â½Â¤ÃŽÃ‚¾¤Î¾ðÊó */
-      canna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
-      canna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
+      Vcanna_empty_info = (ks->info & KanjiEmptyInfo) ? 1 : 0;
+      Vcanna_through_info = (ks->info & KanjiThroughInfo) ? 1 : 0;
     }
 
   return val;
@@ -440,7 +440,7 @@ If nil is specified for each arg, the default value will be used.
       jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
 #else
       /* mule Â¤Ã€Â¤ÃƒÂ¤Â¿Â¤Ã©ÃˆÂ¾Â³Ã‘¥«¥¿¥«¥Ê¤â»È¤¨¤ë */
-      if (canna_inhibit_hankakukana)
+      if (Vcanna_inhibit_hankakukana)
        jrKanjiControl (0, KC_INHIBITHANKAKUKANA, (char *) 1);
 #endif
       jrKanjiControl (0, KC_YOMIINFO, (char *) 2); /* Â¢Â¨Â£Â²: Â¥Ã­Â¡Â¼Â¥ÃžÂ»ÃºÂ¤ÃžÂ¤Ã‡ÃŠÃ–¤¹ */
@@ -872,149 +872,150 @@ DEFUN ("canna-henkan-quit", Fcanna_henkan_quit, 0, 0, 0, /*
 
 /* variables below this line is constants of Canna */
 
-static int canna_mode_AlphaMode;
-static int canna_mode_EmptyMode;
-static int canna_mode_KigoMode;
-static int canna_mode_YomiMode;
-static int canna_mode_JishuMode;
-static int canna_mode_TankouhoMode;
-static int canna_mode_IchiranMode;
-static int canna_mode_YesNoMode;
-static int canna_mode_OnOffMode;
+static int Vcanna_mode_AlphaMode = IROHA_MODE_AlphaMode;
+static int Vcanna_mode_EmptyMode = IROHA_MODE_EmptyMode;
+static int Vcanna_mode_KigoMode = IROHA_MODE_KigoMode;
+static int Vcanna_mode_YomiMode = IROHA_MODE_YomiMode;
+static int Vcanna_mode_JishuMode = IROHA_MODE_JishuMode;
+static int Vcanna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
+static int Vcanna_mode_IchiranMode = IROHA_MODE_IchiranMode;
+static int Vcanna_mode_YesNoMode = IROHA_MODE_YesNoMode;
+static int Vcanna_mode_OnOffMode = IROHA_MODE_OnOffMode;
 #ifdef CANNA_MODE_AdjustBunsetsuMode
-static int canna_mode_AdjustBunsetsuMode;
+static int Vcanna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
 #endif
 #ifdef CANNA_MODE_ChikujiYomiMode
-static int canna_mode_ChikujiYomiMode;
-static int canna_mode_ChikujiTanMode;
+static int Vcanna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
+static int Vcanna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
 #endif
 
-static int canna_mode_HenkanMode;
+static int Vcanna_mode_HenkanMode = IROHA_MODE_HenkanMode;
 #ifdef CANNA_MODE_HenkanNyuryokuMode
-static int canna_mode_HenkanNyuryokuMode;
+static int Vcanna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
 #endif
 #ifdef CANNA_MODE_ZenHiraHenkanMode
-static int canna_mode_ZenHiraHenkanMode;
+static int Vcanna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
 #ifdef CANNA_MODE_HanHiraHenkanMode
-static int canna_mode_HanHiraHenkanMode;
+static int Vcanna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
 #endif
-static int canna_mode_ZenKataHenkanMode;
-static int canna_mode_HanKataHenkanMode;
-static int canna_mode_ZenAlphaHenkanMode;
-static int canna_mode_HanAlphaHenkanMode;
+static int Vcanna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
+static int Vcanna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
+static int Vcanna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
+static int Vcanna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
 #endif
-static int canna_mode_ZenHiraKakuteiMode;
+static int Vcanna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
 #ifdef CANNA_MODE_HanHiraKakuteiMode
-static int canna_mode_HanHiraKakuteiMode;
+static int Vcanna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
 #endif
-static int canna_mode_ZenKataKakuteiMode;
-static int canna_mode_HanKataKakuteiMode;
-static int canna_mode_ZenAlphaKakuteiMode;
-static int canna_mode_HanAlphaKakuteiMode;
-static int canna_mode_HexMode;
-static int canna_mode_BushuMode;
-static int canna_mode_ExtendMode;
-static int canna_mode_RussianMode;
-static int canna_mode_GreekMode;
-static int canna_mode_LineMode;
-static int canna_mode_ChangingServerMode;
-static int canna_mode_HenkanMethodMode;
-static int canna_mode_DeleteDicMode;
-static int canna_mode_TourokuMode;
-static int canna_mode_TourokuEmptyMode;
-static int canna_mode_TourokuHinshiMode;
-static int canna_mode_TourokuDicMode;
-static int canna_mode_QuotedInsertMode;
-static int canna_mode_BubunMuhenkanMode;
-static int canna_mode_MountDicMode;
-
-static int canna_fn_SelfInsert;
-static int canna_fn_FunctionalInsert;
-static int canna_fn_QuotedInsert;
-static int canna_fn_JapaneseMode;
-static int canna_fn_AlphaMode;
-static int canna_fn_HenkanNyuryokuMode;
-static int canna_fn_Forward;
-static int canna_fn_Backward;
-static int canna_fn_Next;
-static int canna_fn_Prev;
-static int canna_fn_BeginningOfLine;
-static int canna_fn_EndOfLine;
-static int canna_fn_DeleteNext;
-static int canna_fn_DeletePrevious;
-static int canna_fn_KillToEndOfLine;
-static int canna_fn_Henkan;
-static int canna_fn_Kakutei;
-static int canna_fn_Extend;
-static int canna_fn_Shrink;
+static int Vcanna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
+static int Vcanna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
+static int Vcanna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
+static int Vcanna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
+static int Vcanna_mode_HexMode = IROHA_MODE_HexMode;
+static int Vcanna_mode_BushuMode = IROHA_MODE_BushuMode;
+static int Vcanna_mode_ExtendMode = IROHA_MODE_ExtendMode;
+static int Vcanna_mode_RussianMode = IROHA_MODE_RussianMode;
+static int Vcanna_mode_GreekMode = IROHA_MODE_GreekMode;
+static int Vcanna_mode_LineMode = IROHA_MODE_LineMode;
+static int Vcanna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
+static int Vcanna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
+static int Vcanna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
+static int Vcanna_mode_TourokuMode = IROHA_MODE_TourokuMode;
+static int Vcanna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
+static int Vcanna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
+static int Vcanna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
+static int Vcanna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
+static int Vcanna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
+static int Vcanna_mode_MountDicMode = IROHA_MODE_MountDicMode;
+
+static int Vcanna_fn_SelfInsert = IROHA_FN_SelfInsert;
+static int Vcanna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
+static int Vcanna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
+static int Vcanna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
+static int Vcanna_fn_AlphaMode = IROHA_FN_AlphaMode;
+static int Vcanna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
+static int Vcanna_fn_Forward = IROHA_FN_Forward;
+static int Vcanna_fn_Backward = IROHA_FN_Backward;
+static int Vcanna_fn_Next = IROHA_FN_Next;
+static int Vcanna_fn_Prev = IROHA_FN_Prev;
+static int Vcanna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
+static int Vcanna_fn_EndOfLine = IROHA_FN_EndOfLine;
+static int Vcanna_fn_DeleteNext = IROHA_FN_DeleteNext;
+static int Vcanna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
+static int Vcanna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
+static int Vcanna_fn_Henkan = IROHA_FN_Henkan;
+static int Vcanna_fn_Kakutei = IROHA_FN_Kakutei;
+static int Vcanna_fn_Extend = IROHA_FN_Extend;
+static int Vcanna_fn_Shrink = IROHA_FN_Shrink;
 #ifdef CANNA_FN_AdjustBunsetsu
-static int canna_fn_AdjustBunsetsu;
+static int Vcanna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
 #endif
-static int canna_fn_Quit;
-static int canna_fn_ConvertAsHex;
-static int canna_fn_ConvertAsBushu;
-static int canna_fn_KouhoIchiran;
-static int canna_fn_BubunMuhenkan;
-static int canna_fn_Zenkaku;
-static int canna_fn_Hankaku;
-static int canna_fn_ToUpper;
-static int canna_fn_Capitalize;
-static int canna_fn_ToLower;
-static int canna_fn_Hiragana;
-static int canna_fn_Katakana;
-static int canna_fn_Romaji;
+static int Vcanna_fn_Quit = IROHA_FN_Quit;
+static int Vcanna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
+static int Vcanna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
+static int Vcanna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
+static int Vcanna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
+static int Vcanna_fn_Zenkaku = IROHA_FN_Zenkaku;
+static int Vcanna_fn_Hankaku = IROHA_FN_Hankaku;
+static int Vcanna_fn_ToUpper = IROHA_FN_ToUpper;
+static int Vcanna_fn_Capitalize = IROHA_FN_Capitalize;
+static int Vcanna_fn_ToLower = IROHA_FN_ToLower;
+static int Vcanna_fn_Hiragana = IROHA_FN_Hiragana;
+static int Vcanna_fn_Katakana = IROHA_FN_Katakana;
+static int Vcanna_fn_Romaji = IROHA_FN_Romaji;
 #ifdef CANNA_FN_BaseHiragana
-static int canna_fn_BaseHiragana;
-static int canna_fn_BaseKatakana;
-static int canna_fn_BaseEisu;
-static int canna_fn_BaseZenkaku;
-static int canna_fn_BaseHankaku;
-static int canna_fn_BaseKana;
-static int canna_fn_BaseKakutei;
-static int canna_fn_BaseHenkan;
-static int canna_fn_BaseHiraKataToggle;
-static int canna_fn_BaseZenHanToggle;
-static int canna_fn_BaseKanaEisuToggle;
-static int canna_fn_BaseKakuteiHenkanToggle;
-static int canna_fn_BaseRotateForward;
-static int canna_fn_BaseRotateBackward;
+static int Vcanna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
+static int Vcanna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
+static int Vcanna_fn_BaseEisu = CANNA_FN_BaseEisu;
+static int Vcanna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
+static int Vcanna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
+static int Vcanna_fn_BaseKana = CANNA_FN_BaseKana;
+static int Vcanna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
+static int Vcanna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
+static int Vcanna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
+static int Vcanna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
+static int Vcanna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
+static int Vcanna_fn_BaseKakuteiHenkanToggle =
+  CANNA_FN_BaseKakuteiHenkanToggle;
+static int Vcanna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
+static int Vcanna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
 #endif
-static int canna_fn_ExtendMode;
-static int canna_fn_Touroku;
-static int canna_fn_HexMode;
-static int canna_fn_BushuMode;
-static int canna_fn_KigouMode;
+static int Vcanna_fn_ExtendMode = IROHA_FN_ExtendMode;
+static int Vcanna_fn_Touroku = IROHA_FN_Touroku;
+static int Vcanna_fn_HexMode = IROHA_FN_HexMode;
+static int Vcanna_fn_BushuMode = IROHA_FN_BushuMode;
+static int Vcanna_fn_KigouMode = IROHA_FN_KigouMode;
 #ifdef CANNA_FN_Mark
-static int canna_fn_Mark;
+static int Vcanna_fn_Mark = CANNA_FN_Mark;
 #endif
 #ifdef CANNA_FN_TemporalMode
-static int canna_fn_TemporalMode;
+static int Vcanna_fn_TemporalMode = CANNA_FN_TemporalMode;
 #endif
 
-static int canna_key_Nfer;
-static int canna_key_Xfer;
-static int canna_key_Up;
-static int canna_key_Left;
-static int canna_key_Right;
-static int canna_key_Down;
-static int canna_key_Insert;
-static int canna_key_Rollup;
-static int canna_key_Rolldown;
-static int canna_key_Home;
-static int canna_key_Help;
-static int canna_key_KP_Key;
-static int canna_key_Shift_Nfer;
-static int canna_key_Shift_Xfer;
-static int canna_key_Shift_Up;
-static int canna_key_Shift_Left;
-static int canna_key_Shift_Right;
-static int canna_key_Shift_Down;
-static int canna_key_Cntrl_Nfer;
-static int canna_key_Cntrl_Xfer;
-static int canna_key_Cntrl_Up;
-static int canna_key_Cntrl_Left;
-static int canna_key_Cntrl_Right;
-static int canna_key_Cntrl_Down;
+static int Vcanna_key_Nfer = IROHA_KEY_Nfer;
+static int Vcanna_key_Xfer = IROHA_KEY_Xfer;
+static int Vcanna_key_Up = IROHA_KEY_Up;
+static int Vcanna_key_Left = IROHA_KEY_Left;
+static int Vcanna_key_Right = IROHA_KEY_Right;
+static int Vcanna_key_Down = IROHA_KEY_Down;
+static int Vcanna_key_Insert = IROHA_KEY_Insert;
+static int Vcanna_key_Rollup = IROHA_KEY_Rollup;
+static int Vcanna_key_Rolldown = IROHA_KEY_Rolldown;
+static int Vcanna_key_Home = IROHA_KEY_Home;
+static int Vcanna_key_Help = IROHA_KEY_Help;
+static int Vcanna_key_KP_Key = IROHA_KEY_KP_Key;
+static int Vcanna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
+static int Vcanna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
+static int Vcanna_key_Shift_Up = IROHA_KEY_Shift_Up;
+static int Vcanna_key_Shift_Left = IROHA_KEY_Shift_Left;
+static int Vcanna_key_Shift_Right = IROHA_KEY_Shift_Right;
+static int Vcanna_key_Shift_Down = IROHA_KEY_Shift_Down;
+static int Vcanna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
+static int Vcanna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
+static int Vcanna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
+static int Vcanna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
+static int Vcanna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
+static int Vcanna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
 
 Lisp_Object VCANNA; /* by MORIOKA Tomohiko <morioka@jaist.ac.jp>
                          1996/6/7 */
@@ -1051,721 +1052,464 @@ vars_of_mule_canna (void)
   DEFVAR_LISP ("canna-kakutei-string", &Vcanna_kakutei_string /*
 
 */ );
-  Vcanna_kakutei_string = Qnil;
-
   DEFVAR_LISP ("canna-kakutei-yomi",   &Vcanna_kakutei_yomi /*
 
 */ );
-  Vcanna_kakutei_yomi = Qnil;
-
   DEFVAR_LISP ("canna-kakutei-romaji", &Vcanna_kakutei_romaji /*
 
 */ );
-  Vcanna_kakutei_romaji = Qnil;
-
   DEFVAR_LISP ("canna-henkan-string",  &Vcanna_henkan_string /*
 
 */ );
-  Vcanna_henkan_string = Qnil;
-
-  DEFVAR_INT ("canna-henkan-length",  &canna_henkan_length /*
+  DEFVAR_INT ("canna-henkan-length",  &Vcanna_henkan_length /*
 
 */ );
-  canna_henkan_length = 0;
-
-  DEFVAR_INT ("canna-henkan-revpos",  &canna_henkan_revPos /*
+  DEFVAR_INT ("canna-henkan-revpos",  &Vcanna_henkan_revPos /*
 
 */ );
-  canna_henkan_revPos = 0;
-
-  DEFVAR_INT ("canna-henkan-revlen",  &canna_henkan_revLen /*
+  DEFVAR_INT ("canna-henkan-revlen",  &Vcanna_henkan_revLen /*
 
 */ );
-  canna_henkan_revLen = 0;
-
   DEFVAR_LISP ("canna-ichiran-string", &Vcanna_ichiran_string /*
 
 */ );
-  Vcanna_ichiran_string = Qnil;
-
-  DEFVAR_INT ("canna-ichiran-length", &canna_ichiran_length /*
+  DEFVAR_INT ("canna-ichiran-length", &Vcanna_ichiran_length /*
 
 */ );
-  canna_ichiran_length = 0;
-
-  DEFVAR_INT ("canna-ichiran-revpos", &canna_ichiran_revPos /*
+  DEFVAR_INT ("canna-ichiran-revpos", &Vcanna_ichiran_revPos /*
 
 */ );
-  canna_ichiran_revPos = 0;
-
-  DEFVAR_INT ("canna-ichiran-revlen", &canna_ichiran_revLen /*
+  DEFVAR_INT ("canna-ichiran-revlen", &Vcanna_ichiran_revLen /*
 
 */ );
-  canna_ichiran_revLen = 0;
-
   DEFVAR_LISP ("canna-mode-string",    &Vcanna_mode_string /*
 
 */ );
-  Vcanna_mode_string = Qnil;
 
-  DEFVAR_BOOL ("canna-empty-info", &canna_empty_info /*
+  DEFVAR_BOOL ("canna-empty-info", &Vcanna_empty_info /*
 For canna
 */ );
-  canna_empty_info = 0;
-
-  DEFVAR_BOOL ("canna-through-info", &canna_through_info /*
+  DEFVAR_BOOL ("canna-through-info", &Vcanna_through_info /*
 For canna
 */ );
-  canna_through_info = 0;
-
-  DEFVAR_BOOL ("canna-underline", &canna_underline /*
+  DEFVAR_BOOL ("canna-underline", &Vcanna_underline /*
 For canna
 */ );
-  canna_underline = 0;
-
-  DEFVAR_BOOL ("canna-inhibit-hankakukana", &canna_inhibit_hankakukana /*
+  DEFVAR_BOOL ("canna-inhibit-hankakukana", &Vcanna_inhibit_hankakukana /*
 For canna
 */ );
-  canna_inhibit_hankakukana = 0;
 
-  DEFVAR_INT ("canna-mode-alpha-mode", &canna_mode_AlphaMode /*
+  DEFVAR_INT ("canna-mode-alpha-mode", &Vcanna_mode_AlphaMode /*
 
 */ );
-  canna_mode_AlphaMode = IROHA_MODE_AlphaMode;
-
-  DEFVAR_INT ("canna-mode-empty-mode", &canna_mode_EmptyMode /*
+  DEFVAR_INT ("canna-mode-empty-mode", &Vcanna_mode_EmptyMode /*
 
 */ );
-  canna_mode_EmptyMode = IROHA_MODE_EmptyMode;
-
-  DEFVAR_INT ("canna-mode-kigo-mode",  &canna_mode_KigoMode /*
+  DEFVAR_INT ("canna-mode-kigo-mode",  &Vcanna_mode_KigoMode /*
 
 */ );
-  canna_mode_KigoMode = IROHA_MODE_KigoMode;
-
-  DEFVAR_INT ("canna-mode-yomi-mode",  &canna_mode_YomiMode /*
+  DEFVAR_INT ("canna-mode-yomi-mode",  &Vcanna_mode_YomiMode /*
 
 */ );
-  canna_mode_YomiMode = IROHA_MODE_YomiMode;
-
-  DEFVAR_INT ("canna-mode-jishu-mode", &canna_mode_JishuMode /*
+  DEFVAR_INT ("canna-mode-jishu-mode", &Vcanna_mode_JishuMode /*
 
 */ );
-  canna_mode_JishuMode = IROHA_MODE_JishuMode;
-
-  DEFVAR_INT ("canna-mode-tankouho-mode", &canna_mode_TankouhoMode /*
+  DEFVAR_INT ("canna-mode-tankouho-mode", &Vcanna_mode_TankouhoMode /*
 
 */ );
-  canna_mode_TankouhoMode = IROHA_MODE_TankouhoMode;
-
-  DEFVAR_INT ("canna-mode-ichiran-mode",  &canna_mode_IchiranMode /*
+  DEFVAR_INT ("canna-mode-ichiran-mode",  &Vcanna_mode_IchiranMode /*
 
 */ );
-  canna_mode_IchiranMode = IROHA_MODE_IchiranMode;
-
-  DEFVAR_INT ("canna-mode-yes-no-mode", &canna_mode_YesNoMode /*
+  DEFVAR_INT ("canna-mode-yes-no-mode", &Vcanna_mode_YesNoMode /*
 
 */ );
-  canna_mode_YesNoMode = IROHA_MODE_YesNoMode;
-
-  DEFVAR_INT ("canna-mode-on-off-mode", &canna_mode_OnOffMode /*
+  DEFVAR_INT ("canna-mode-on-off-mode", &Vcanna_mode_OnOffMode /*
 
 */ );
-  canna_mode_OnOffMode = IROHA_MODE_OnOffMode;
-
 #ifdef CANNA_MODE_AdjustBunsetsuMode
   DEFVAR_INT ("canna-mode-adjust-bunsetsu-mode",
-             &canna_mode_AdjustBunsetsuMode /*
+             &Vcanna_mode_AdjustBunsetsuMode /*
 
 */ );
-  canna_mode_AdjustBunsetsuMode = CANNA_MODE_AdjustBunsetsuMode;
 #endif
 #ifdef CANNA_MODE_ChikujiYomiMode
-  DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &canna_mode_ChikujiYomiMode /*
+  DEFVAR_INT ("canna-mode-chikuji-yomi-mode", &Vcanna_mode_ChikujiYomiMode /*
 
 */ );
-  canna_mode_ChikujiYomiMode = CANNA_MODE_ChikujiYomiMode;
-
   DEFVAR_INT ("canna-mode-chikuji-bunsetsu-mode",
-             &canna_mode_ChikujiTanMode /*
+             &Vcanna_mode_ChikujiTanMode /*
 
 */ );
-  canna_mode_ChikujiTanMode = CANNA_MODE_ChikujiTanMode;
 #endif
 
-  DEFVAR_INT ("canna-mode-henkan-mode", &canna_mode_HenkanMode /*
+  DEFVAR_INT ("canna-mode-henkan-mode", &Vcanna_mode_HenkanMode /*
 
 */ );
-  canna_mode_HenkanMode = IROHA_MODE_HenkanMode;
-
 #ifdef CANNA_MODE_HenkanNyuryokuMode
   DEFVAR_INT ("canna-mode-henkan-nyuuryoku-mode",
-             &canna_mode_HenkanNyuryokuMode /*
+             &Vcanna_mode_HenkanNyuryokuMode /*
 
 */ );
-  canna_mode_HenkanNyuryokuMode = CANNA_MODE_HenkanNyuryokuMode;
 #endif
 #ifdef CANNA_MODE_ZenHiraHenkanMode
   DEFVAR_INT ("canna-mode-zen-hira-henkan-mode",
-             &canna_mode_ZenHiraHenkanMode /*
+             &Vcanna_mode_ZenHiraHenkanMode /*
 
 */ );
-  canna_mode_ZenHiraHenkanMode = CANNA_MODE_ZenHiraHenkanMode;
 #ifdef CANNA_MODE_HanHiraHenkanMode
   DEFVAR_INT ("canna-mode-han-hira-henkan-mode",
-             &canna_mode_HanHiraHenkanMode /*
+             &Vcanna_mode_HanHiraHenkanMode /*
 
 */ );
-  canna_mode_HanHiraHenkanMode = CANNA_MODE_HanHiraHenkanMode;
 #endif
   DEFVAR_INT ("canna-mode-zen-kata-henkan-mode",
-             &canna_mode_ZenKataHenkanMode /*
+             &Vcanna_mode_ZenKataHenkanMode /*
 
 */ );
-  canna_mode_ZenKataHenkanMode = CANNA_MODE_ZenKataHenkanMode;
-
   DEFVAR_INT ("canna-mode-han-kata-henkan-mode",
-             &canna_mode_HanKataHenkanMode /*
+             &Vcanna_mode_HanKataHenkanMode /*
 
 */ );
-  canna_mode_HanKataHenkanMode = CANNA_MODE_HanKataHenkanMode;
-
   DEFVAR_INT ("canna-mode-zen-alpha-henkan-mode",
-             &canna_mode_ZenAlphaHenkanMode /*
+             &Vcanna_mode_ZenAlphaHenkanMode /*
 
 */ );
-  canna_mode_ZenAlphaHenkanMode = CANNA_MODE_ZenAlphaHenkanMode;
-
   DEFVAR_INT ("canna-mode-han-alpha-henkan-mode",
-             &canna_mode_HanAlphaHenkanMode /*
+             &Vcanna_mode_HanAlphaHenkanMode /*
 
 */ );
-  canna_mode_HanAlphaHenkanMode = CANNA_MODE_HanAlphaHenkanMode;
 #endif
   DEFVAR_INT ("canna-mode-zen-hira-kakutei-mode",
-             &canna_mode_ZenHiraKakuteiMode /*
+             &Vcanna_mode_ZenHiraKakuteiMode /*
 
 */ );
-  canna_mode_ZenHiraKakuteiMode = IROHA_MODE_ZenHiraKakuteiMode;
 #ifdef CANNA_MODE_HanHiraKakuteiMode
   DEFVAR_INT ("canna-mode-han-hira-kakutei-mode",
-             &canna_mode_HanHiraKakuteiMode /*
+             &Vcanna_mode_HanHiraKakuteiMode /*
 
 */ );
-  canna_mode_HanHiraKakuteiMode = CANNA_MODE_HanHiraKakuteiMode;
 #endif
   DEFVAR_INT ("canna-mode-zen-kata-kakutei-mode",
-             &canna_mode_ZenKataKakuteiMode /*
+             &Vcanna_mode_ZenKataKakuteiMode /*
 
 */ );
-  canna_mode_ZenKataKakuteiMode = IROHA_MODE_ZenKataKakuteiMode;
-
   DEFVAR_INT ("canna-mode-han-kata-kakutei-mode",
-             &canna_mode_HanKataKakuteiMode /*
+             &Vcanna_mode_HanKataKakuteiMode /*
 
 */ );
-  canna_mode_HanKataKakuteiMode = IROHA_MODE_HanKataKakuteiMode;
-
   DEFVAR_INT ("canna-mode-zen-alpha-kakutei-mode",
-             &canna_mode_ZenAlphaKakuteiMode /*
+             &Vcanna_mode_ZenAlphaKakuteiMode /*
 
 */ );
-  canna_mode_ZenAlphaKakuteiMode = IROHA_MODE_ZenAlphaKakuteiMode;
-
   DEFVAR_INT ("canna-mode-han-alpha-kakutei-mode",
-             &canna_mode_HanAlphaKakuteiMode /*
+             &Vcanna_mode_HanAlphaKakuteiMode /*
 
 */ );
-  canna_mode_HanAlphaKakuteiMode = IROHA_MODE_HanAlphaKakuteiMode;
-
-  DEFVAR_INT ("canna-mode-hex-mode", &canna_mode_HexMode /*
+  DEFVAR_INT ("canna-mode-hex-mode", &Vcanna_mode_HexMode /*
 
 */ );
-  canna_mode_HexMode = IROHA_MODE_HexMode;
-
-  DEFVAR_INT ("canna-mode-bushu-mode", &canna_mode_BushuMode /*
+  DEFVAR_INT ("canna-mode-bushu-mode", &Vcanna_mode_BushuMode /*
 
 */ );
-  canna_mode_BushuMode = IROHA_MODE_BushuMode;
-
-  DEFVAR_INT ("canna-mode-extend-mode", &canna_mode_ExtendMode /*
+  DEFVAR_INT ("canna-mode-extend-mode", &Vcanna_mode_ExtendMode /*
 
 */ );
-  canna_mode_ExtendMode = IROHA_MODE_ExtendMode;
-
-  DEFVAR_INT ("canna-mode-russian-mode", &canna_mode_RussianMode /*
+  DEFVAR_INT ("canna-mode-russian-mode", &Vcanna_mode_RussianMode /*
 
 */ );
-  canna_mode_RussianMode = IROHA_MODE_RussianMode;
-
-  DEFVAR_INT ("canna-mode-greek-mode", &canna_mode_GreekMode /*
+  DEFVAR_INT ("canna-mode-greek-mode", &Vcanna_mode_GreekMode /*
 
 */ );
-  canna_mode_GreekMode = IROHA_MODE_GreekMode;
-
-  DEFVAR_INT ("canna-mode-line-mode", &canna_mode_LineMode /*
+  DEFVAR_INT ("canna-mode-line-mode", &Vcanna_mode_LineMode /*
 
 */ );
-  canna_mode_LineMode = IROHA_MODE_LineMode;
-
   DEFVAR_INT ("canna-mode-changing-server-mode",
-             &canna_mode_ChangingServerMode /*
+             &Vcanna_mode_ChangingServerMode /*
 
 */ );
-  canna_mode_ChangingServerMode = IROHA_MODE_ChangingServerMode;
-
   DEFVAR_INT ("canna-mode-henkan-method-mode",
-             &canna_mode_HenkanMethodMode /*
+             &Vcanna_mode_HenkanMethodMode /*
 
 */ );
-  canna_mode_HenkanMethodMode = IROHA_MODE_HenkanMethodMode;
-
-  DEFVAR_INT ("canna-mode-delete-dic-mode", &canna_mode_DeleteDicMode /*
+  DEFVAR_INT ("canna-mode-delete-dic-mode", &Vcanna_mode_DeleteDicMode /*
 
 */ );
-  canna_mode_DeleteDicMode = IROHA_MODE_DeleteDicMode;
-
-  DEFVAR_INT ("canna-mode-touroku-mode", &canna_mode_TourokuMode /*
+  DEFVAR_INT ("canna-mode-touroku-mode", &Vcanna_mode_TourokuMode /*
 
 */ );
-  canna_mode_TourokuMode = IROHA_MODE_TourokuMode;
-
   DEFVAR_INT ("canna-mode-touroku-empty-mode",
-             &canna_mode_TourokuEmptyMode /*
+             &Vcanna_mode_TourokuEmptyMode /*
 
 */ );
-  canna_mode_TourokuEmptyMode = IROHA_MODE_TourokuEmptyMode;
-
   DEFVAR_INT ("canna-mode-touroku-hinshi-mode",
-             &canna_mode_TourokuHinshiMode /*
+             &Vcanna_mode_TourokuHinshiMode /*
 
 */ );
-  canna_mode_TourokuHinshiMode = IROHA_MODE_TourokuHinshiMode;
-
-  DEFVAR_INT ("canna-mode-touroku-dic-mode", &canna_mode_TourokuDicMode /*
+  DEFVAR_INT ("canna-mode-touroku-dic-mode", &Vcanna_mode_TourokuDicMode /*
 
 */ );
-  canna_mode_TourokuDicMode = IROHA_MODE_TourokuDicMode;
-
   DEFVAR_INT ("canna-mode-quoted-insert-mode",
-             &canna_mode_QuotedInsertMode /*
+             &Vcanna_mode_QuotedInsertMode /*
 
 */ );
-  canna_mode_QuotedInsertMode = IROHA_MODE_QuotedInsertMode;
-
   DEFVAR_INT ("canna-mode-bubun-muhenkan-mode",
-             &canna_mode_BubunMuhenkanMode /*
+             &Vcanna_mode_BubunMuhenkanMode /*
 
 */ );
-  canna_mode_BubunMuhenkanMode = IROHA_MODE_BubunMuhenkanMode;
-
-  DEFVAR_INT ("canna-mode-mount-dic-mode", &canna_mode_MountDicMode /*
+  DEFVAR_INT ("canna-mode-mount-dic-mode", &Vcanna_mode_MountDicMode /*
 
 */ );
-  canna_mode_MountDicMode = IROHA_MODE_MountDicMode;
 
-  DEFVAR_INT ("canna-func-self-insert", &canna_fn_SelfInsert  /*
+  DEFVAR_INT ("canna-func-self-insert", &Vcanna_fn_SelfInsert  /*
 
 */ );
-  canna_fn_SelfInsert = IROHA_FN_SelfInsert;
-
-  DEFVAR_INT ("canna-func-functional-insert", &canna_fn_FunctionalInsert  /*
+  DEFVAR_INT ("canna-func-functional-insert", &Vcanna_fn_FunctionalInsert  /*
 
 */ );
-  canna_fn_FunctionalInsert = IROHA_FN_FunctionalInsert;
-
-  DEFVAR_INT ("canna-func-quoted-insert", &canna_fn_QuotedInsert  /*
+  DEFVAR_INT ("canna-func-quoted-insert", &Vcanna_fn_QuotedInsert  /*
 
 */ );
-  canna_fn_QuotedInsert = IROHA_FN_QuotedInsert;
-
-  DEFVAR_INT ("canna-func-japanese-mode", &canna_fn_JapaneseMode  /*
+  DEFVAR_INT ("canna-func-japanese-mode", &Vcanna_fn_JapaneseMode  /*
 
 */ );
-  canna_fn_JapaneseMode = IROHA_FN_JapaneseMode;
-
-  DEFVAR_INT ("canna-func-alpha-mode", &canna_fn_AlphaMode  /*
+  DEFVAR_INT ("canna-func-alpha-mode", &Vcanna_fn_AlphaMode  /*
 
 */ );
-  canna_fn_AlphaMode = IROHA_FN_AlphaMode;
-
   DEFVAR_INT ("canna-func-henkan-nyuryoku-mode",
-             &canna_fn_HenkanNyuryokuMode  /*
+             &Vcanna_fn_HenkanNyuryokuMode  /*
 
 */ );
-  canna_fn_HenkanNyuryokuMode = IROHA_FN_HenkanNyuryokuMode;
-
-  DEFVAR_INT ("canna-func-forward", &canna_fn_Forward  /*
+  DEFVAR_INT ("canna-func-forward", &Vcanna_fn_Forward  /*
 
 */ );
-  canna_fn_Forward = IROHA_FN_Forward;
-
-  DEFVAR_INT ("canna-func-backward", &canna_fn_Backward  /*
+  DEFVAR_INT ("canna-func-backward", &Vcanna_fn_Backward  /*
 
 */ );
-  canna_fn_Backward = IROHA_FN_Backward;
-
-  DEFVAR_INT ("canna-func-next", &canna_fn_Next  /*
+  DEFVAR_INT ("canna-func-next", &Vcanna_fn_Next  /*
 
 */ );
-  canna_fn_Next = IROHA_FN_Next;
-
-  DEFVAR_INT ("canna-func-previous", &canna_fn_Prev  /*
+  DEFVAR_INT ("canna-func-previous", &Vcanna_fn_Prev  /*
 
 */ );
-  canna_fn_Prev = IROHA_FN_Prev;
-
-  DEFVAR_INT ("canna-func-beginning-of-line", &canna_fn_BeginningOfLine  /*
+  DEFVAR_INT ("canna-func-beginning-of-line", &Vcanna_fn_BeginningOfLine  /*
 
 */ );
-  canna_fn_BeginningOfLine = IROHA_FN_BeginningOfLine;
-
-  DEFVAR_INT ("canna-func-end-of-line", &canna_fn_EndOfLine  /*
+  DEFVAR_INT ("canna-func-end-of-line", &Vcanna_fn_EndOfLine  /*
 
 */ );
-  canna_fn_EndOfLine = IROHA_FN_EndOfLine;
-
-  DEFVAR_INT ("canna-func-delete-next", &canna_fn_DeleteNext  /*
+  DEFVAR_INT ("canna-func-delete-next", &Vcanna_fn_DeleteNext  /*
 
 */ );
-  canna_fn_DeleteNext = IROHA_FN_DeleteNext;
-
-  DEFVAR_INT ("canna-func-delete_previous", &canna_fn_DeletePrevious  /*
+  DEFVAR_INT ("canna-func-delete_previous", &Vcanna_fn_DeletePrevious  /*
 
 */ );
-  canna_fn_DeletePrevious = IROHA_FN_DeletePrevious;
-
-  DEFVAR_INT ("canna-func-kill-to-end-of-line", &canna_fn_KillToEndOfLine /*
+  DEFVAR_INT ("canna-func-kill-to-end-of-line", &Vcanna_fn_KillToEndOfLine /*
 
 */ );
-  canna_fn_KillToEndOfLine = IROHA_FN_KillToEndOfLine;
-
-  DEFVAR_INT ("canna-func-henkan", &canna_fn_Henkan  /*
+  DEFVAR_INT ("canna-func-henkan", &Vcanna_fn_Henkan  /*
 
 */ );
-  canna_fn_Henkan = IROHA_FN_Henkan;
-
-  DEFVAR_INT ("canna-func-kakutei", &canna_fn_Kakutei  /*
+  DEFVAR_INT ("canna-func-kakutei", &Vcanna_fn_Kakutei  /*
 
 */ );
-  canna_fn_Kakutei = IROHA_FN_Kakutei;
-
-  DEFVAR_INT ("canna-func-extend", &canna_fn_Extend  /*
+  DEFVAR_INT ("canna-func-extend", &Vcanna_fn_Extend  /*
 
 */ );
-  canna_fn_Extend = IROHA_FN_Extend;
-
-  DEFVAR_INT ("canna-func-shrink", &canna_fn_Shrink  /*
+  DEFVAR_INT ("canna-func-shrink", &Vcanna_fn_Shrink  /*
 
 */ );
-  canna_fn_Shrink = IROHA_FN_Shrink;
-
 #ifdef CANNA_FN_AdjustBunsetsu
-  DEFVAR_INT ("canna-func-adjust-bunsetsu", &canna_fn_AdjustBunsetsu  /*
+  DEFVAR_INT ("canna-func-adjust-bunsetsu", &Vcanna_fn_AdjustBunsetsu  /*
 
 */ );
-  canna_fn_AdjustBunsetsu = CANNA_FN_AdjustBunsetsu;
 #endif
-  DEFVAR_INT ("canna-func-quit", &canna_fn_Quit  /*
+  DEFVAR_INT ("canna-func-quit", &Vcanna_fn_Quit  /*
 
 */ );
-  canna_fn_Quit = IROHA_FN_Quit;
-
-  DEFVAR_INT ("canna-func-convert-as-hex", &canna_fn_ConvertAsHex  /*
+  DEFVAR_INT ("canna-func-convert-as-hex", &Vcanna_fn_ConvertAsHex  /*
 
 */ );
-  canna_fn_ConvertAsHex = IROHA_FN_ConvertAsHex;
-
-  DEFVAR_INT ("canna-func-convert-as-bushu", &canna_fn_ConvertAsBushu  /*
+  DEFVAR_INT ("canna-func-convert-as-bushu", &Vcanna_fn_ConvertAsBushu  /*
 
 */ );
-  canna_fn_ConvertAsBushu = IROHA_FN_ConvertAsBushu;
-
-  DEFVAR_INT ("canna-func-kouho-ichiran", &canna_fn_KouhoIchiran  /*
+  DEFVAR_INT ("canna-func-kouho-ichiran", &Vcanna_fn_KouhoIchiran  /*
 
 */ );
-  canna_fn_KouhoIchiran = IROHA_FN_KouhoIchiran;
-
-  DEFVAR_INT ("canna-func-bubun-muhenkan", &canna_fn_BubunMuhenkan  /*
+  DEFVAR_INT ("canna-func-bubun-muhenkan", &Vcanna_fn_BubunMuhenkan  /*
 
 */ );
-  canna_fn_BubunMuhenkan = IROHA_FN_BubunMuhenkan;
-
-  DEFVAR_INT ("canna-func-zenkaku", &canna_fn_Zenkaku  /*
+  DEFVAR_INT ("canna-func-zenkaku", &Vcanna_fn_Zenkaku  /*
 
 */ );
-  canna_fn_Zenkaku = IROHA_FN_Zenkaku;
-
-  DEFVAR_INT ("canna-func-hankaku", &canna_fn_Hankaku  /*
+  DEFVAR_INT ("canna-func-hankaku", &Vcanna_fn_Hankaku  /*
 
 */ );
-  canna_fn_Hankaku = IROHA_FN_Hankaku;
-
-  DEFVAR_INT ("canna-func-to-upper", &canna_fn_ToUpper  /*
+  DEFVAR_INT ("canna-func-to-upper", &Vcanna_fn_ToUpper  /*
 
 */ );
-  canna_fn_ToUpper = IROHA_FN_ToUpper;
-
-  DEFVAR_INT ("canna-func-capitalize", &canna_fn_Capitalize  /*
+  DEFVAR_INT ("canna-func-capitalize", &Vcanna_fn_Capitalize  /*
 
 */ );
-  canna_fn_Capitalize = IROHA_FN_Capitalize;
-
-  DEFVAR_INT ("canna-func-to-lower", &canna_fn_ToLower  /*
+  DEFVAR_INT ("canna-func-to-lower", &Vcanna_fn_ToLower  /*
 
 */ );
-  canna_fn_ToLower = IROHA_FN_ToLower;
-
-  DEFVAR_INT ("canna-func-hiragana", &canna_fn_Hiragana  /*
+  DEFVAR_INT ("canna-func-hiragana", &Vcanna_fn_Hiragana  /*
 
 */ );
-  canna_fn_Hiragana = IROHA_FN_Hiragana;
-
-  DEFVAR_INT ("canna-func-katakana", &canna_fn_Katakana  /*
+  DEFVAR_INT ("canna-func-katakana", &Vcanna_fn_Katakana  /*
 
 */ );
-  canna_fn_Katakana = IROHA_FN_Katakana;
-
-  DEFVAR_INT ("canna-func-romaji", &canna_fn_Romaji  /*
+  DEFVAR_INT ("canna-func-romaji", &Vcanna_fn_Romaji  /*
 
 */ );
-  canna_fn_Romaji = IROHA_FN_Romaji;
-
 #ifdef CANNA_FN_BaseHiragana
-  DEFVAR_INT ("canna-func-base-hiragana", &canna_fn_BaseHiragana  /*
+  DEFVAR_INT ("canna-func-base-hiragana", &Vcanna_fn_BaseHiragana  /*
 
 */ );
-  canna_fn_BaseHiragana = CANNA_FN_BaseHiragana;
-
-  DEFVAR_INT ("canna-func-base-katakana", &canna_fn_BaseKatakana  /*
+  DEFVAR_INT ("canna-func-base-katakana", &Vcanna_fn_BaseKatakana  /*
 
 */ );
-  canna_fn_BaseKatakana = CANNA_FN_BaseKatakana;
-
-  DEFVAR_INT ("canna-func-base-eisu", &canna_fn_BaseEisu  /*
+  DEFVAR_INT ("canna-func-base-eisu", &Vcanna_fn_BaseEisu  /*
 
 */ );
-  canna_fn_BaseEisu = CANNA_FN_BaseEisu;
-
-  DEFVAR_INT ("canna-func-base-zenkaku", &canna_fn_BaseZenkaku  /*
+  DEFVAR_INT ("canna-func-base-zenkaku", &Vcanna_fn_BaseZenkaku  /*
 
 */ );
-  canna_fn_BaseZenkaku = CANNA_FN_BaseZenkaku;
-
-  DEFVAR_INT ("canna-func-base-hankaku", &canna_fn_BaseHankaku  /*
+  DEFVAR_INT ("canna-func-base-hankaku", &Vcanna_fn_BaseHankaku  /*
 
 */ );
-  canna_fn_BaseHankaku = CANNA_FN_BaseHankaku;
-
-  DEFVAR_INT ("canna-func-base-kana", &canna_fn_BaseKana  /*
+  DEFVAR_INT ("canna-func-base-kana", &Vcanna_fn_BaseKana  /*
 
 */ );
-  canna_fn_BaseKana = CANNA_FN_BaseKana;
-
-  DEFVAR_INT ("canna-func-base-kakutei", &canna_fn_BaseKakutei  /*
+  DEFVAR_INT ("canna-func-base-kakutei", &Vcanna_fn_BaseKakutei  /*
 
 */ );
-  canna_fn_BaseKakutei = CANNA_FN_BaseKakutei;
-
-  DEFVAR_INT ("canna-func-base-henkan", &canna_fn_BaseHenkan  /*
+  DEFVAR_INT ("canna-func-base-henkan", &Vcanna_fn_BaseHenkan  /*
 
 */ );
-  canna_fn_BaseHenkan = CANNA_FN_BaseHenkan;
-
   DEFVAR_INT ("canna-func-base-hiragana-katakana-toggle",
-             &canna_fn_BaseHiraKataToggle  /*
+             &Vcanna_fn_BaseHiraKataToggle  /*
 
 */ );
-  canna_fn_BaseHiraKataToggle = CANNA_FN_BaseHiraKataToggle;
-
   DEFVAR_INT ("canna-func-base-zenkaku-hankaku-toggle",
-             &canna_fn_BaseZenHanToggle  /*
+             &Vcanna_fn_BaseZenHanToggle  /*
 
 */ );
-  canna_fn_BaseZenHanToggle = CANNA_FN_BaseZenHanToggle;
-
   DEFVAR_INT ("canna-func-base-kana-eisu-toggle",
-             &canna_fn_BaseKanaEisuToggle  /*
+             &Vcanna_fn_BaseKanaEisuToggle  /*
 
 */ );
-  canna_fn_BaseKanaEisuToggle = CANNA_FN_BaseKanaEisuToggle;
-
   DEFVAR_INT ("canna-func-base-kakutei-henkan-toggle",
-             &canna_fn_BaseKakuteiHenkanToggle  /*
+             &Vcanna_fn_BaseKakuteiHenkanToggle  /*
 
 */ );
-  canna_fn_BaseKakuteiHenkanToggle = CANNA_FN_BaseKakuteiHenkanToggle;
-
   DEFVAR_INT ("canna-func-base-rotate-forward",
-             &canna_fn_BaseRotateForward  /*
+             &Vcanna_fn_BaseRotateForward  /*
 
 */ );
-  canna_fn_BaseRotateForward = CANNA_FN_BaseRotateForward;
-
   DEFVAR_INT ("canna-func-base-rotate-backward",
-             &canna_fn_BaseRotateBackward  /*
+             &Vcanna_fn_BaseRotateBackward  /*
 
 */ );
-  canna_fn_BaseRotateBackward = CANNA_FN_BaseRotateBackward;
-
 #endif
-  DEFVAR_INT ("canna-func-extend-mode", &canna_fn_ExtendMode  /*
+  DEFVAR_INT ("canna-func-extend-mode", &Vcanna_fn_ExtendMode  /*
 
 */ );
-  canna_fn_ExtendMode = IROHA_FN_ExtendMode;
-
-  DEFVAR_INT ("canna-func-touroku", &canna_fn_Touroku  /*
+  DEFVAR_INT ("canna-func-touroku", &Vcanna_fn_Touroku  /*
 
 */ );
-  canna_fn_Touroku = IROHA_FN_Touroku;
-
-  DEFVAR_INT ("canna-func-hex-mode", &canna_fn_HexMode  /*
+  DEFVAR_INT ("canna-func-hex-mode", &Vcanna_fn_HexMode  /*
 
 */ );
-  canna_fn_HexMode = IROHA_FN_HexMode;
-
-  DEFVAR_INT ("canna-func-bushu-mode", &canna_fn_BushuMode  /*
+  DEFVAR_INT ("canna-func-bushu-mode", &Vcanna_fn_BushuMode  /*
 
 */ );
-  canna_fn_BushuMode = IROHA_FN_BushuMode;
-
-  DEFVAR_INT ("canna-func-kigo-mode", &canna_fn_KigouMode  /*
+  DEFVAR_INT ("canna-func-kigo-mode", &Vcanna_fn_KigouMode  /*
 
 */ );
-  canna_fn_KigouMode = IROHA_FN_KigouMode;
-
 #ifdef CANNA_FN_Mark
-  DEFVAR_INT ("canna-func-mark", &canna_fn_Mark  /*
+  DEFVAR_INT ("canna-func-mark", &Vcanna_fn_Mark  /*
 
 */ );
-  canna_fn_Mark = CANNA_FN_Mark;
 #endif
 #ifdef CANNA_FN_TemporalMode
-  DEFVAR_INT ("canna-func-temporal-mode", &canna_fn_TemporalMode  /*
+  DEFVAR_INT ("canna-func-temporal-mode", &Vcanna_fn_TemporalMode  /*
 
 */ );
-  canna_fn_TemporalMode = CANNA_FN_TemporalMode;
 #endif
 
-  DEFVAR_INT ("canna-key-nfer", &canna_key_Nfer /*
+  DEFVAR_INT ("canna-key-nfer", &Vcanna_key_Nfer /*
 
 */ );
-  canna_key_Nfer = IROHA_KEY_Nfer;
-
-  DEFVAR_INT ("canna-key-xfer", &canna_key_Xfer /*
+  DEFVAR_INT ("canna-key-xfer", &Vcanna_key_Xfer /*
 
 */ );
-  canna_key_Xfer = IROHA_KEY_Xfer;
-
-  DEFVAR_INT ("canna-key-up", &canna_key_Up /*
+  DEFVAR_INT ("canna-key-up", &Vcanna_key_Up /*
 
 */ );
-  canna_key_Up = IROHA_KEY_Up;
-
-  DEFVAR_INT ("canna-key-left", &canna_key_Left /*
+  DEFVAR_INT ("canna-key-left", &Vcanna_key_Left /*
 
 */ );
-  canna_key_Left = IROHA_KEY_Left;
-
-  DEFVAR_INT ("canna-key-right", &canna_key_Right /*
+  DEFVAR_INT ("canna-key-right", &Vcanna_key_Right /*
 
 */ );
-  canna_key_Right = IROHA_KEY_Right;
-
-  DEFVAR_INT ("canna-key-down", &canna_key_Down /*
+  DEFVAR_INT ("canna-key-down", &Vcanna_key_Down /*
 
 */ );
-  canna_key_Down = IROHA_KEY_Down;
-
-  DEFVAR_INT ("canna-key-insert", &canna_key_Insert /*
+  DEFVAR_INT ("canna-key-insert", &Vcanna_key_Insert /*
 
 */ );
-  canna_key_Insert = IROHA_KEY_Insert;
-
-  DEFVAR_INT ("canna-key-rollup", &canna_key_Rollup /*
+  DEFVAR_INT ("canna-key-rollup", &Vcanna_key_Rollup /*
 
 */ );
-  canna_key_Rollup = IROHA_KEY_Rollup;
-
-  DEFVAR_INT ("canna-key-rolldown", &canna_key_Rolldown /*
+  DEFVAR_INT ("canna-key-rolldown", &Vcanna_key_Rolldown /*
 
 */ );
-  canna_key_Rolldown = IROHA_KEY_Rolldown;
-
-  DEFVAR_INT ("canna-key-home", &canna_key_Home /*
+  DEFVAR_INT ("canna-key-home", &Vcanna_key_Home /*
 
 */ );
-  canna_key_Home = IROHA_KEY_Home;
-
-  DEFVAR_INT ("canna-key-help", &canna_key_Help /*
+  DEFVAR_INT ("canna-key-help", &Vcanna_key_Help /*
 
 */ );
-  canna_key_Help = IROHA_KEY_Help;
-
-  DEFVAR_INT ("canna-key-kp-key", &canna_key_KP_Key /*
+  DEFVAR_INT ("canna-key-kp-key", &Vcanna_key_KP_Key /*
 
 */ );
-  canna_key_KP_Key = IROHA_KEY_KP_Key;
-
-  DEFVAR_INT ("canna-key-shift-nfer", &canna_key_Shift_Nfer /*
+  DEFVAR_INT ("canna-key-shift-nfer", &Vcanna_key_Shift_Nfer /*
 
 */ );
-  canna_key_Shift_Nfer = IROHA_KEY_Shift_Nfer;
-
-  DEFVAR_INT ("canna-key-shift-xfer", &canna_key_Shift_Xfer /*
+  DEFVAR_INT ("canna-key-shift-xfer", &Vcanna_key_Shift_Xfer /*
 
 */ );
-  canna_key_Shift_Xfer = IROHA_KEY_Shift_Xfer;
-
-  DEFVAR_INT ("canna-key-shift-up", &canna_key_Shift_Up /*
+  DEFVAR_INT ("canna-key-shift-up", &Vcanna_key_Shift_Up /*
 
 */ );
-  canna_key_Shift_Up = IROHA_KEY_Shift_Up;
-
-  DEFVAR_INT ("canna-key-shift-left", &canna_key_Shift_Left /*
+  DEFVAR_INT ("canna-key-shift-left", &Vcanna_key_Shift_Left /*
 
 */ );
-  canna_key_Shift_Left = IROHA_KEY_Shift_Left;
-
-  DEFVAR_INT ("canna-key-shift-right", &canna_key_Shift_Right /*
+  DEFVAR_INT ("canna-key-shift-right", &Vcanna_key_Shift_Right /*
 
 */ );
-  canna_key_Shift_Right = IROHA_KEY_Shift_Right;
-
-  DEFVAR_INT ("canna-key-shift-down", &canna_key_Shift_Down /*
+  DEFVAR_INT ("canna-key-shift-down", &Vcanna_key_Shift_Down /*
 
 */ );
-  canna_key_Shift_Down = IROHA_KEY_Shift_Down;
-
-  DEFVAR_INT ("canna-key-control-nfer", &canna_key_Cntrl_Nfer /*
+  DEFVAR_INT ("canna-key-control-nfer", &Vcanna_key_Cntrl_Nfer /*
 
 */ );
-  canna_key_Cntrl_Nfer = IROHA_KEY_Cntrl_Nfer;
-
-  DEFVAR_INT ("canna-key-control-xfer", &canna_key_Cntrl_Xfer /*
+  DEFVAR_INT ("canna-key-control-xfer", &Vcanna_key_Cntrl_Xfer /*
 
 */ );
-  canna_key_Cntrl_Xfer = IROHA_KEY_Cntrl_Xfer;
-
-  DEFVAR_INT ("canna-key-control-up", &canna_key_Cntrl_Up /*
+  DEFVAR_INT ("canna-key-control-up", &Vcanna_key_Cntrl_Up /*
 
 */ );
-  canna_key_Cntrl_Up = IROHA_KEY_Cntrl_Up;
-
-  DEFVAR_INT ("canna-key-control-left", &canna_key_Cntrl_Left /*
+  DEFVAR_INT ("canna-key-control-left", &Vcanna_key_Cntrl_Left /*
 
 */ );
-  canna_key_Cntrl_Left = IROHA_KEY_Cntrl_Left;
-
-  DEFVAR_INT ("canna-key-control-right", &canna_key_Cntrl_Right /*
+  DEFVAR_INT ("canna-key-control-right", &Vcanna_key_Cntrl_Right /*
 
 */ );
-  canna_key_Cntrl_Right = IROHA_KEY_Cntrl_Right;
-
-  DEFVAR_INT ("canna-key-control-down", &canna_key_Cntrl_Down /*
+  DEFVAR_INT ("canna-key-control-down", &Vcanna_key_Cntrl_Down /*
 
 */ );
-  canna_key_Cntrl_Down = IROHA_KEY_Cntrl_Down;
 
   Fprovide(intern("CANNA"));
 }
diff --git a/src/mule-coding.c b/src/mule-coding.c
new file mode 100644 (file)
index 0000000..a0a4ff9
--- /dev/null
@@ -0,0 +1,4807 @@
+/* Code conversion functions.
+   Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Mule 2.3.   Not in FSF. */
+
+/* Rewritten by Ben Wing <ben@xemacs.org>. */
+
+#if 0                          /* while file-coding not split up */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "elhash.h"
+#include "insdel.h"
+#include "lstream.h"
+#include "mule-ccl.h"
+#include "mule-coding.h"
+
+Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error;
+
+Lisp_Object Vkeyboard_coding_system;
+Lisp_Object Vterminal_coding_system;
+Lisp_Object Vcoding_system_for_read;
+Lisp_Object Vcoding_system_for_write;
+Lisp_Object Vfile_name_coding_system;
+
+/* Table of symbols identifying each coding category. */
+Lisp_Object coding_category_symbol[CODING_CATEGORY_LAST + 1];
+
+/* Coding system currently associated with each coding category. */
+Lisp_Object coding_category_system[CODING_CATEGORY_LAST + 1];
+
+/* Table of all coding categories in decreasing order of priority.
+   This describes a permutation of the possible coding categories. */
+int coding_category_by_priority[CODING_CATEGORY_LAST + 1];
+
+Lisp_Object Qcoding_system_p;
+
+Lisp_Object Qbig5, Qshift_jis, Qno_conversion, Qccl, Qiso2022;
+/* Qinternal in general.c */
+
+Lisp_Object Qmnemonic, Qeol_type;
+Lisp_Object Qcr, Qcrlf, Qlf;
+Lisp_Object Qeol_cr, Qeol_crlf, Qeol_lf;
+Lisp_Object Qpost_read_conversion;
+Lisp_Object Qpre_write_conversion;
+
+Lisp_Object Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
+Lisp_Object Qforce_g0_on_output, Qforce_g1_on_output;
+Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output;
+Lisp_Object Qshort, Qno_ascii_eol, Qno_ascii_cntl, Qseven, Qlock_shift;
+Lisp_Object Qno_iso6429, Qescape_quoted;
+Lisp_Object Qinput_charset_conversion, Qoutput_charset_conversion;
+
+Lisp_Object Qencode, Qdecode;
+
+Lisp_Object Qctext;
+
+Lisp_Object Vcoding_system_hashtable;
+
+int enable_multibyte_characters;
+
+/* Additional information used by the ISO2022 decoder and detector. */
+struct iso2022_decoder
+{
+  /* CHARSET holds the character sets currently assigned to the G0
+     through G3 variables.  It is initialized from the array
+     INITIAL_CHARSET in CODESYS. */
+  Lisp_Object charset[4];
+
+  /* Which registers are currently invoked into the left (GL) and
+     right (GR) halves of the 8-bit encoding space? */
+  int register_left, register_right;
+
+  /* ISO_ESC holds a value indicating part of an escape sequence
+     that has already been seen. */
+  enum iso_esc_flag esc;
+
+  /* This records the bytes we've seen so far in an escape sequence,
+     in case the sequence is invalid (we spit out the bytes unchanged). */
+  unsigned char esc_bytes[8];
+
+  /* Index for next byte to store in ISO escape sequence. */
+  int esc_bytes_index;
+
+  /* Stuff seen so far when composing a string. */
+  unsigned_char_dynarr *composite_chars;
+
+  /* If we saw an invalid designation sequence for a particular
+     register, we flag it here and switch to ASCII.  The next time we
+     see a valid designation for this register, we turn off the flag
+     and do the designation normally, but pretend the sequence was
+     invalid.  The effect of all this is that (most of the time) the
+     escape sequences for both the switch to the unknown charset, and
+     the switch back to the known charset, get inserted literally into
+     the buffer and saved out as such.  The hope is that we can
+     preserve the escape sequences so that the resulting written out
+     file makes sense.  If we don't do any of this, the designation
+     to the invalid charset will be preserved but that switch back
+     to the known charset will probably get eaten because it was
+     the same charset that was already present in the register. */
+  unsigned char invalid_designated[4];
+
+  /* We try to do similar things as above for direction-switching
+     sequences.  If we encountered a direction switch while an
+     invalid designation was present, or an invalid designation
+     just after a direction switch (i.e. no valid designation
+     encountered yet), we insert the direction-switch escape
+     sequence literally into the output stream, and later on
+     insert the corresponding direction-restoring escape sequence
+     literally also. */
+  unsigned int switched_dir_and_no_valid_charset_yet :1;
+  unsigned int invalid_switch_dir :1;
+
+  /* Tells the decoder to output the escape sequence literally
+     even though it was valid.  Used in the games we play to
+     avoid lossage when we encounter invalid designations. */
+  unsigned int output_literally :1;
+  /* We encountered a direction switch followed by an invalid
+     designation.  We didn't output the direction switch
+     literally because we didn't know about the invalid designation;
+     but we have to do so now. */
+  unsigned int output_direction_sequence :1;
+};
+
+EXFUN (Fcopy_coding_system, 2);
+struct detection_state;
+static int detect_coding_sjis (struct detection_state *st,
+                              CONST unsigned char *src,
+                              unsigned int n);
+static void decode_coding_sjis (Lstream *decoding,
+                               CONST unsigned char *src,
+                               unsigned_char_dynarr *dst,
+                               unsigned int n);
+static void encode_coding_sjis (Lstream *encoding,
+                               CONST unsigned char *src,
+                               unsigned_char_dynarr *dst,
+                               unsigned int n);
+static int detect_coding_big5 (struct detection_state *st,
+                              CONST unsigned char *src,
+                              unsigned int n);
+static void decode_coding_big5 (Lstream *decoding,
+                               CONST unsigned char *src,
+                               unsigned_char_dynarr *dst, unsigned int n);
+static void encode_coding_big5 (Lstream *encoding,
+                               CONST unsigned char *src,
+                               unsigned_char_dynarr *dst, unsigned int n);
+static int postprocess_iso2022_mask (int mask);
+static void reset_iso2022 (Lisp_Object coding_system,
+                          struct iso2022_decoder *iso);
+static int detect_coding_iso2022 (struct detection_state *st,
+                                 CONST unsigned char *src,
+                                 unsigned int n);
+static void decode_coding_iso2022 (Lstream *decoding,
+                                  CONST unsigned char *src,
+                                  unsigned_char_dynarr *dst, unsigned int n);
+static void encode_coding_iso2022 (Lstream *encoding,
+                                  CONST unsigned char *src,
+                                  unsigned_char_dynarr *dst, unsigned int n);
+static void decode_coding_no_conversion (Lstream *decoding,
+                                        CONST unsigned char *src,
+                                        unsigned_char_dynarr *dst,
+                                        unsigned int n);
+static void encode_coding_no_conversion (Lstream *encoding,
+                                        CONST unsigned char *src,
+                                        unsigned_char_dynarr *dst,
+                                        unsigned int n);
+static void mule_decode (Lstream *decoding, CONST unsigned char *src,
+                        unsigned_char_dynarr *dst, unsigned int n);
+static void mule_encode (Lstream *encoding, CONST unsigned char *src,
+                        unsigned_char_dynarr *dst, unsigned int n);
+
+typedef struct codesys_prop codesys_prop;
+struct codesys_prop
+{
+  Lisp_Object sym;
+  int prop_type;
+};
+
+typedef struct
+{
+  Dynarr_declare (codesys_prop);
+} codesys_prop_dynarr;
+
+codesys_prop_dynarr *the_codesys_prop_dynarr;
+
+enum codesys_prop_enum
+{
+  CODESYS_PROP_ALL_OK,
+  CODESYS_PROP_ISO2022,
+  CODESYS_PROP_CCL
+};
+
+\f
+/************************************************************************/
+/*                       Coding system functions                        */
+/************************************************************************/
+
+static Lisp_Object
+mark_coding_system (Lisp_Object obj, void (*markobj) (Lisp_Object))
+{
+  struct Lisp_Coding_System *codesys = XCODING_SYSTEM (obj);
+
+  (markobj) (CODING_SYSTEM_NAME (codesys));
+  (markobj) (CODING_SYSTEM_DOC_STRING (codesys));
+  (markobj) (CODING_SYSTEM_MNEMONIC (codesys));
+  (markobj) (CODING_SYSTEM_EOL_LF (codesys));
+  (markobj) (CODING_SYSTEM_EOL_CRLF (codesys));
+  (markobj) (CODING_SYSTEM_EOL_CR (codesys));
+
+  switch (CODING_SYSTEM_TYPE (codesys))
+    {
+      int i;
+    case CODESYS_ISO2022:
+      for (i = 0; i < 4; i++)
+       (markobj) (CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i));
+      if (codesys->iso2022.input_conv)
+       {
+         for (i = 0; i < Dynarr_length (codesys->iso2022.input_conv); i++)
+           {
+             struct charset_conversion_spec *ccs =
+               Dynarr_atp (codesys->iso2022.input_conv, i);
+             (markobj) (ccs->from_charset);
+             (markobj) (ccs->to_charset);
+           }
+       }
+      if (codesys->iso2022.output_conv)
+       {
+         for (i = 0; i < Dynarr_length (codesys->iso2022.output_conv); i++)
+           {
+             struct charset_conversion_spec *ccs =
+               Dynarr_atp (codesys->iso2022.output_conv, i);
+             (markobj) (ccs->from_charset);
+             (markobj) (ccs->to_charset);
+           }
+       }
+      break;
+
+    case CODESYS_CCL:
+      (markobj) (CODING_SYSTEM_CCL_DECODE (codesys));
+      (markobj) (CODING_SYSTEM_CCL_ENCODE (codesys));
+      break;
+    default:
+      break;
+    }
+
+  (markobj) (CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys));
+  return CODING_SYSTEM_POST_READ_CONVERSION (codesys);
+}
+
+static void
+print_coding_system (Lisp_Object obj, Lisp_Object printcharfun,
+                    int escapeflag)
+{
+  struct Lisp_Coding_System *c = XCODING_SYSTEM (obj);
+  if (print_readably)
+    error ("printing unreadable object #<coding_system 0x%x>",
+          c->header.uid);
+
+  write_c_string ("#<coding_system ", printcharfun);
+  print_internal (c->name, printcharfun, 1);
+  write_c_string (">", printcharfun);
+}
+
+static void
+finalize_coding_system (void *header, int for_disksave)
+{
+  struct Lisp_Coding_System *c = (struct Lisp_Coding_System *) header;
+  /* Since coding systems never go away, this function is not
+     necessary.  But it would be necessary if we changed things
+     so that coding systems could go away. */
+  if (!for_disksave) /* see comment in lstream.c */
+    {
+      switch (CODING_SYSTEM_TYPE (c))
+       {
+       case CODESYS_ISO2022:
+         if (c->iso2022.input_conv)
+           {
+             Dynarr_free (c->iso2022.input_conv);
+             c->iso2022.input_conv = 0;
+           }
+         if (c->iso2022.output_conv)
+           {
+             Dynarr_free (c->iso2022.output_conv);
+             c->iso2022.output_conv = 0;
+           }
+         break;
+
+       default:
+         break;
+       }
+    }
+}
+
+DEFINE_LRECORD_IMPLEMENTATION ("coding-system", coding_system,
+                              mark_coding_system, print_coding_system,
+                              finalize_coding_system,
+                              0, 0, struct Lisp_Coding_System);
+
+static enum eol_type
+symbol_to_eol_type (Lisp_Object symbol)
+{
+  CHECK_SYMBOL (symbol);
+  if (NILP (symbol))      return EOL_AUTODETECT;
+  if (EQ (symbol, Qlf))   return EOL_LF;
+  if (EQ (symbol, Qcrlf)) return EOL_CRLF;
+  if (EQ (symbol, Qcr))   return EOL_CR;
+
+  signal_simple_error ("Unrecognized eol type", symbol);
+  return EOL_AUTODETECT; /* not reached */
+}
+
+static Lisp_Object
+eol_type_to_symbol (enum eol_type type)
+{
+  switch (type)
+    {
+    case EOL_LF:         return Qlf;
+    case EOL_CRLF:       return Qcrlf;
+    case EOL_CR:         return Qcr;
+    case EOL_AUTODETECT: return Qnil;
+    default:             abort (); return Qnil; /* not reached */
+    }
+}
+
+static void
+setup_eol_coding_systems (struct Lisp_Coding_System *codesys)
+{
+  Lisp_Object codesys_obj;
+  int len = string_length (XSYMBOL (CODING_SYSTEM_NAME (codesys))->name);
+  char *codesys_name = (char *) alloca (len + 7);
+  Lisp_Object codesys_name_sym, sub_codesys_obj;
+
+  /* kludge */
+
+  XSETCODING_SYSTEM (codesys_obj, codesys);
+
+  memcpy (codesys_name,
+         string_data (XSYMBOL (CODING_SYSTEM_NAME (codesys))->name), len);
+
+#define DEFINE_SUB_CODESYS(op_sys, Type) do {  \
+    strcpy (codesys_name + len, "-" op_sys);   \
+    codesys_name_sym = intern (codesys_name);  \
+    sub_codesys_obj = Fcopy_coding_system (codesys_obj, codesys_name_sym); \
+    XCODING_SYSTEM_EOL_TYPE (sub_codesys_obj) = Type; \
+    CODING_SYSTEM_##Type (codesys) = sub_codesys_obj; \
+} while (0)
+
+  DEFINE_SUB_CODESYS("unix", EOL_LF);
+  DEFINE_SUB_CODESYS("dos",  EOL_CRLF);
+  DEFINE_SUB_CODESYS("mac",  EOL_CR);
+}
+
+DEFUN ("coding-system-p", Fcoding_system_p, 1, 1, 0, /*
+Return t if OBJECT is a coding system.
+A coding system is an object that defines how text containing multiple
+character sets is encoded into a stream of (typically 8-bit) bytes.
+The coding system is used to decode the stream into a series of
+characters (which may be from multiple charsets) when the text is read
+from a file or process, and is used to encode the text back into the
+same format when it is written out to a file or process.
+
+For example, many ISO2022-compliant coding systems (such as Compound
+Text, which is used for inter-client data under the X Window System)
+use escape sequences to switch between different charsets -- Japanese
+Kanji, for example, is invoked with "ESC $ ( B"; ASCII is invoked
+with "ESC ( B"; and Cyrillic is invoked with "ESC - L".  See
+`make-coding-system' for more information.
+
+Coding systems are normally identified using a symbol, and the
+symbol is accepted in place of the actual coding system object whenever
+a coding system is called for. (This is similar to how faces work.)
+*/
+       (object))
+{
+  return CODING_SYSTEMP (object) ? Qt : Qnil;
+}
+
+DEFUN ("find-coding-system", Ffind_coding_system, 1, 1, 0, /*
+Retrieve the coding system of the given name.
+
+If CODING-SYSTEM-OR-NAME is a coding-system object, it is simply
+returned.  Otherwise, CODING-SYSTEM-OR-NAME should be a symbol.
+If there is no such coding system, nil is returned.  Otherwise the
+associated coding system object is returned.
+*/
+       (coding_system_or_name))
+{
+  if (NILP (coding_system_or_name))
+    coding_system_or_name = Qbinary;
+  if (CODING_SYSTEMP (coding_system_or_name))
+    return coding_system_or_name;
+  CHECK_SYMBOL (coding_system_or_name);
+
+  return Fgethash (coding_system_or_name, Vcoding_system_hashtable, Qnil);
+}
+
+DEFUN ("get-coding-system", Fget_coding_system, 1, 1, 0, /*
+Retrieve the coding system of the given name.
+Same as `find-coding-system' except that if there is no such
+coding system, an error is signaled instead of returning nil.
+*/
+       (name))
+{
+  Lisp_Object coding_system = Ffind_coding_system (name);
+
+  if (NILP (coding_system))
+    signal_simple_error ("No such coding system", name);
+  return coding_system;
+}
+
+/* We store the coding systems in hash tables with the names as the key and the
+   actual coding system object as the value.  Occasionally we need to use them
+   in a list format.  These routines provide us with that. */
+struct coding_system_list_closure
+{
+  Lisp_Object *coding_system_list;
+};
+
+static int
+add_coding_system_to_list_mapper (CONST void *hash_key, void *hash_contents,
+                                 void *coding_system_list_closure)
+{
+  /* This function can GC */
+  Lisp_Object key, contents;
+  Lisp_Object *coding_system_list;
+  struct coding_system_list_closure *cscl =
+    (struct coding_system_list_closure *) coding_system_list_closure;
+  CVOID_TO_LISP (key, hash_key);
+  VOID_TO_LISP (contents, hash_contents);
+  coding_system_list = cscl->coding_system_list;
+
+  *coding_system_list = Fcons (XCODING_SYSTEM (contents)->name,
+                              *coding_system_list);
+  return 0;
+}
+
+DEFUN ("coding-system-list", Fcoding_system_list, 0, 0, 0, /*
+Return a list of the names of all defined coding systems.
+*/
+       ())
+{
+  Lisp_Object coding_system_list = Qnil;
+  struct gcpro gcpro1;
+  struct coding_system_list_closure coding_system_list_closure;
+
+  GCPRO1 (coding_system_list);
+  coding_system_list_closure.coding_system_list = &coding_system_list;
+  elisp_maphash (add_coding_system_to_list_mapper, Vcoding_system_hashtable,
+                &coding_system_list_closure);
+  UNGCPRO;
+
+  return coding_system_list;
+}
+
+DEFUN ("coding-system-name", Fcoding_system_name, 1, 1, 0, /*
+Return the name of the given coding system.
+*/
+       (coding_system))
+{
+  coding_system = Fget_coding_system (coding_system);
+  return XCODING_SYSTEM_NAME (coding_system);
+}
+
+static struct Lisp_Coding_System *
+allocate_coding_system (enum coding_system_type type, Lisp_Object name)
+{
+  struct Lisp_Coding_System *codesys =
+    alloc_lcrecord_type (struct Lisp_Coding_System, lrecord_coding_system);
+
+  zero_lcrecord (codesys);
+  CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys) = Qnil;
+  CODING_SYSTEM_POST_READ_CONVERSION (codesys) = Qnil;
+  CODING_SYSTEM_EOL_TYPE (codesys) = EOL_AUTODETECT;
+  CODING_SYSTEM_EOL_CRLF (codesys) = Qnil;
+  CODING_SYSTEM_EOL_CR   (codesys) = Qnil;
+  CODING_SYSTEM_EOL_LF   (codesys) = Qnil;
+  CODING_SYSTEM_TYPE     (codesys) = type;
+
+  if (type == CODESYS_ISO2022)
+    {
+      int i;
+      for (i = 0; i < 4; i++)
+       CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i) = Qnil;
+    }
+  else if (type == CODESYS_CCL)
+    {
+      CODING_SYSTEM_CCL_DECODE (codesys) = Qnil;
+      CODING_SYSTEM_CCL_ENCODE (codesys) = Qnil;
+    }
+
+  CODING_SYSTEM_NAME (codesys) = name;
+
+  return codesys;
+}
+
+/* Given a list of charset conversion specs as specified in a Lisp
+   program, parse it into STORE_HERE. */
+
+static void
+parse_charset_conversion_specs (charset_conversion_spec_dynarr *store_here,
+                               Lisp_Object spec_list)
+{
+  Lisp_Object rest;
+
+  EXTERNAL_LIST_LOOP (rest, spec_list)
+    {
+      Lisp_Object car = XCAR (rest);
+      Lisp_Object from, to;
+      struct charset_conversion_spec spec;
+
+      if (!CONSP (car) || !CONSP (XCDR (car)) || !NILP (XCDR (XCDR (car))))
+       signal_simple_error ("Invalid charset conversion spec", car);
+      from = Fget_charset (XCAR (car));
+      to = Fget_charset (XCAR (XCDR (car)));
+      if (XCHARSET_TYPE (from) != XCHARSET_TYPE (to))
+       signal_simple_error_2
+         ("Attempted conversion between different charset types",
+          from, to);
+      spec.from_charset = from;
+      spec.to_charset = to;
+
+      Dynarr_add (store_here, spec);
+    }
+}
+
+/* Given a dynarr LOAD_HERE of internally-stored charset conversion
+   specs, return the equivalent as the Lisp programmer would see it.
+
+   If LOAD_HERE is 0, return Qnil. */
+
+static Lisp_Object
+unparse_charset_conversion_specs (charset_conversion_spec_dynarr *load_here)
+{
+  int i;
+  Lisp_Object result = Qnil;
+
+  if (!load_here)
+    return Qnil;
+  for (i = 0; i < Dynarr_length (load_here); i++)
+    {
+      struct charset_conversion_spec *ccs =
+       Dynarr_atp (load_here, i);
+      result = Fcons (list2 (ccs->from_charset, ccs->to_charset), result);
+    }
+
+  return Fnreverse (result);
+}
+
+DEFUN ("make-coding-system", Fmake_coding_system, 2, 4, 0, /*
+Register symbol NAME as a coding system.
+
+TYPE describes the conversion method used and should be one of
+
+nil or 'undecided
+     Automatic conversion.  XEmacs attempts to detect the coding system
+     used in the file.
+'no-conversion
+     No conversion.  Use this for binary files and such.  On output,
+     graphic characters that are not in ASCII or Latin-1 will be
+     replaced by a ?. (For a no-conversion-encoded buffer, these
+     characters will only be present if you explicitly insert them.)
+'shift-jis
+     Shift-JIS (a Japanese encoding commonly used in PC operating systems).
+'iso2022
+     Any ISO2022-compliant encoding.  Among other things, this includes
+     JIS (the Japanese encoding commonly used for e-mail), EUC (the
+     standard Unix encoding for Japanese and other languages), and
+     Compound Text (the encoding used in X11).  You can specify more
+     specific information about the conversion with the FLAGS argument.
+'big5
+     Big5 (the encoding commonly used for Taiwanese).
+'ccl
+     The conversion is performed using a user-written pseudo-code
+     program.  CCL (Code Conversion Language) is the name of this
+     pseudo-code.
+'internal
+     Write out or read in the raw contents of the memory representing
+     the buffer's text.  This is primarily useful for debugging
+     purposes, and is only enabled when XEmacs has been compiled with
+     DEBUG_XEMACS defined (via the --debug configure option).
+     WARNING: Reading in a file using 'internal conversion can result
+     in an internal inconsistency in the memory representing a
+     buffer's text, which will produce unpredictable results and may
+     cause XEmacs to crash.  Under normal circumstances you should
+     never use 'internal conversion.
+
+DOC-STRING is a string describing the coding system.
+
+PROPS is a property list, describing the specific nature of the
+character set.  Recognized properties are:
+
+'mnemonic
+     String to be displayed in the modeline when this coding system is
+     active.
+
+'eol-type
+     End-of-line conversion to be used.  It should be one of
+
+       nil
+               Automatically detect the end-of-line type (LF, CRLF,
+               or CR).  Also generate subsidiary coding systems named
+               `NAME-unix', `NAME-dos', and `NAME-mac', that are
+               identical to this coding system but have an EOL-TYPE
+               value of 'lf, 'crlf, and 'cr, respectively.
+       'lf
+               The end of a line is marked externally using ASCII LF.
+               Since this is also the way that XEmacs represents an
+               end-of-line internally, specifying this option results
+               in no end-of-line conversion.  This is the standard
+               format for Unix text files.
+       'crlf
+               The end of a line is marked externally using ASCII
+               CRLF.  This is the standard format for MS-DOS text
+               files.
+       'cr
+               The end of a line is marked externally using ASCII CR.
+               This is the standard format for Macintosh text files.
+       t
+               Automatically detect the end-of-line type but do not
+               generate subsidiary coding systems.  (This value is
+               converted to nil when stored internally, and
+               `coding-system-property' will return nil.)
+
+'post-read-conversion
+     Function called after a file has been read in, to perform the
+     decoding.  Called with two arguments, BEG and END, denoting
+     a region of the current buffer to be decoded.
+
+'pre-write-conversion
+     Function called before a file is written out, to perform the
+     encoding.  Called with two arguments, BEG and END, denoting
+     a region of the current buffer to be encoded.
+
+
+The following additional properties are recognized if TYPE is 'iso2022:
+
+'charset-g0
+'charset-g1
+'charset-g2
+'charset-g3
+     The character set initially designated to the G0 - G3 registers.
+     The value should be one of
+
+          -- A charset object (designate that character set)
+         -- nil (do not ever use this register)
+         -- t (no character set is initially designated to
+               the register, but may be later on; this automatically
+               sets the corresponding `force-g*-on-output' property)
+
+'force-g0-on-output
+'force-g1-on-output
+'force-g2-on-output
+'force-g2-on-output
+     If non-nil, send an explicit designation sequence on output before
+     using the specified register.
+
+'short
+     If non-nil, use the short forms "ESC $ @", "ESC $ A", and
+     "ESC $ B" on output in place of the full designation sequences
+     "ESC $ ( @", "ESC $ ( A", and "ESC $ ( B".
+
+'no-ascii-eol
+     If non-nil, don't designate ASCII to G0 at each end of line on output.
+     Setting this to non-nil also suppresses other state-resetting that
+     normally happens at the end of a line.
+
+'no-ascii-cntl
+     If non-nil, don't designate ASCII to G0 before control chars on output.
+
+'seven
+     If non-nil, use 7-bit environment on output.  Otherwise, use 8-bit
+     environment.
+
+'lock-shift
+     If non-nil, use locking-shift (SO/SI) instead of single-shift
+     or designation by escape sequence.
+
+'no-iso6429
+     If non-nil, don't use ISO6429's direction specification.
+
+'escape-quoted
+     If non-nil, literal control characters that are the same as
+     the beginning of a recognized ISO2022 or ISO6429 escape sequence
+     (in particular, ESC (0x1B), SO (0x0E), SI (0x0F), SS2 (0x8E),
+     SS3 (0x8F), and CSI (0x9B)) are "quoted" with an escape character
+     so that they can be properly distinguished from an escape sequence.
+     (Note that doing this results in a non-portable encoding.) This
+     encoding flag is used for byte-compiled files.  Note that ESC
+     is a good choice for a quoting character because there are no
+     escape sequences whose second byte is a character from the Control-0
+     or Control-1 character sets; this is explicitly disallowed by the
+     ISO2022 standard.
+
+'input-charset-conversion
+     A list of conversion specifications, specifying conversion of
+     characters in one charset to another when decoding is performed.
+     Each specification is a list of two elements: the source charset,
+     and the destination charset.
+
+'output-charset-conversion
+     A list of conversion specifications, specifying conversion of
+     characters in one charset to another when encoding is performed.
+     The form of each specification is the same as for
+     'input-charset-conversion.
+
+
+The following additional properties are recognized (and required)
+if TYPE is 'ccl:
+
+'decode
+     CCL program used for decoding (converting to internal format).
+
+'encode
+     CCL program used for encoding (converting to external format).
+*/
+       (name, type, doc_string, props))
+{
+  struct Lisp_Coding_System *codesys;
+  Lisp_Object rest, key, value;
+  enum coding_system_type ty;
+  int need_to_setup_eol_systems = 1;
+
+  /* Convert type to constant */
+  if (NILP (type) || EQ (type, Qundecided))
+                                      { ty = CODESYS_AUTODETECT; }
+  else if (EQ (type, Qshift_jis))     { ty = CODESYS_SHIFT_JIS; }
+  else if (EQ (type, Qiso2022))       { ty = CODESYS_ISO2022; }
+  else if (EQ (type, Qbig5))          { ty = CODESYS_BIG5; }
+  else if (EQ (type, Qccl))           { ty = CODESYS_CCL; }
+  else if (EQ (type, Qno_conversion)) { ty = CODESYS_NO_CONVERSION; }
+#ifdef DEBUG_XEMACS
+  else if (EQ (type, Qinternal))      { ty = CODESYS_INTERNAL; }
+#endif
+  else
+    signal_simple_error ("Invalid coding system type", type);
+
+  CHECK_SYMBOL (name);
+
+  codesys = allocate_coding_system (ty, name);
+
+  if (NILP (doc_string))
+    doc_string = build_string ("");
+  else
+    CHECK_STRING (doc_string);
+  CODING_SYSTEM_DOC_STRING (codesys) = doc_string;
+
+  EXTERNAL_PROPERTY_LIST_LOOP (rest, key, value, props)
+    {
+      if (EQ (key, Qmnemonic))
+       {
+          if (!NILP (value))
+           CHECK_STRING (value);
+         CODING_SYSTEM_MNEMONIC (codesys) = value;
+       }
+
+      else if (EQ (key, Qeol_type))
+       {
+         need_to_setup_eol_systems = NILP (value);
+         if (EQ (value, Qt))
+           value = Qnil;
+         CODING_SYSTEM_EOL_TYPE (codesys) = symbol_to_eol_type (value);
+       }
+
+      else if (EQ (key, Qpost_read_conversion)) CODING_SYSTEM_POST_READ_CONVERSION (codesys) = value;
+      else if (EQ (key, Qpre_write_conversion)) CODING_SYSTEM_PRE_WRITE_CONVERSION (codesys) = value;
+      else if (ty == CODESYS_ISO2022)
+       {
+#define FROB_INITIAL_CHARSET(charset_num) \
+  CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, charset_num) = \
+    ((EQ (value, Qt) || EQ (value, Qnil)) ? value : Fget_charset (value))
+
+         if      (EQ (key, Qcharset_g0)) FROB_INITIAL_CHARSET (0);
+         else if (EQ (key, Qcharset_g1)) FROB_INITIAL_CHARSET (1);
+         else if (EQ (key, Qcharset_g2)) FROB_INITIAL_CHARSET (2);
+         else if (EQ (key, Qcharset_g3)) FROB_INITIAL_CHARSET (3);
+
+#define FROB_FORCE_CHARSET(charset_num) \
+  CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (codesys, charset_num) = !NILP (value)
+
+         else if (EQ (key, Qforce_g0_on_output)) FROB_FORCE_CHARSET (0);
+         else if (EQ (key, Qforce_g1_on_output)) FROB_FORCE_CHARSET (1);
+         else if (EQ (key, Qforce_g2_on_output)) FROB_FORCE_CHARSET (2);
+         else if (EQ (key, Qforce_g3_on_output)) FROB_FORCE_CHARSET (3);
+
+#define FROB_BOOLEAN_PROPERTY(prop) \
+  CODING_SYSTEM_ISO2022_##prop (codesys) = !NILP (value)
+
+         else if (EQ (key, Qshort))         FROB_BOOLEAN_PROPERTY (SHORT);
+         else if (EQ (key, Qno_ascii_eol))  FROB_BOOLEAN_PROPERTY (NO_ASCII_EOL);
+         else if (EQ (key, Qno_ascii_cntl)) FROB_BOOLEAN_PROPERTY (NO_ASCII_CNTL);
+         else if (EQ (key, Qseven))         FROB_BOOLEAN_PROPERTY (SEVEN);
+         else if (EQ (key, Qlock_shift))    FROB_BOOLEAN_PROPERTY (LOCK_SHIFT);
+         else if (EQ (key, Qno_iso6429))    FROB_BOOLEAN_PROPERTY (NO_ISO6429);
+         else if (EQ (key, Qescape_quoted)) FROB_BOOLEAN_PROPERTY (ESCAPE_QUOTED);
+
+         else if (EQ (key, Qinput_charset_conversion))
+           {
+             codesys->iso2022.input_conv =
+               Dynarr_new (charset_conversion_spec);
+             parse_charset_conversion_specs (codesys->iso2022.input_conv,
+                                             value);
+           }
+         else if (EQ (key, Qoutput_charset_conversion))
+           {
+             codesys->iso2022.output_conv =
+               Dynarr_new (charset_conversion_spec);
+             parse_charset_conversion_specs (codesys->iso2022.output_conv,
+                                             value);
+           }
+         else
+           signal_simple_error ("Unrecognized property", key);
+       }
+      else if (EQ (type, Qccl))
+       {
+         if (EQ (key, Qdecode))
+           {
+             CHECK_VECTOR (value);
+             CODING_SYSTEM_CCL_DECODE (codesys) = value;
+           }
+         else if (EQ (key, Qencode))
+           {
+             CHECK_VECTOR (value);
+             CODING_SYSTEM_CCL_ENCODE (codesys) = value;
+           }
+         else
+           signal_simple_error ("Unrecognized property", key);
+       }
+      else
+       signal_simple_error ("Unrecognized property", key);
+    }
+
+  if (need_to_setup_eol_systems)
+    setup_eol_coding_systems (codesys);
+
+  {
+    Lisp_Object codesys_obj;
+    XSETCODING_SYSTEM (codesys_obj, codesys);
+    Fputhash (name, codesys_obj, Vcoding_system_hashtable);
+    return codesys_obj;
+  }
+}
+
+DEFUN ("copy-coding-system", Fcopy_coding_system, 2, 2, 0, /*
+Copy OLD-CODING-SYSTEM to NEW-NAME.
+If NEW-NAME does not name an existing coding system, a new one will
+be created.
+*/
+       (old_coding_system, new_name))
+{
+  Lisp_Object new_coding_system;
+  old_coding_system = Fget_coding_system (old_coding_system);
+  new_coding_system = Ffind_coding_system (new_name);
+  if (NILP (new_coding_system))
+    {
+      XSETCODING_SYSTEM (new_coding_system,
+                        allocate_coding_system
+                        (XCODING_SYSTEM_TYPE (old_coding_system),
+                         new_name));
+      Fputhash (new_name, new_coding_system, Vcoding_system_hashtable);
+    }
+
+  {
+    struct Lisp_Coding_System *to = XCODING_SYSTEM (new_coding_system);
+    struct Lisp_Coding_System *from = XCODING_SYSTEM (old_coding_system);
+    memcpy (((char *) to  ) + sizeof (to->header),
+           ((char *) from) + sizeof (from->header),
+           sizeof (*from) - sizeof (from->header));
+    to->name = new_name;
+  }
+  return new_coding_system;
+}
+
+static Lisp_Object
+subsidiary_coding_system (Lisp_Object coding_system, enum eol_type type)
+{
+  struct Lisp_Coding_System *cs = XCODING_SYSTEM (coding_system);
+  Lisp_Object new_coding_system;
+
+  if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
+    return coding_system;
+
+  switch (type)
+    {
+    case EOL_AUTODETECT: return coding_system;
+    case EOL_LF:   new_coding_system = CODING_SYSTEM_EOL_LF   (cs); break;
+    case EOL_CR:   new_coding_system = CODING_SYSTEM_EOL_CR   (cs); break;
+    case EOL_CRLF: new_coding_system = CODING_SYSTEM_EOL_CRLF (cs); break;
+    default:       abort ();
+    }
+
+  return NILP (new_coding_system) ? coding_system : new_coding_system;
+}
+
+DEFUN ("subsidiary-coding-system", Fsubsidiary_coding_system, 2, 2, 0, /*
+Return the subsidiary coding system of CODING-SYSTEM with eol type EOL-TYPE.
+*/
+       (coding_system, eol_type))
+{
+  coding_system = Fget_coding_system (coding_system);
+
+  return subsidiary_coding_system (coding_system,
+                                  symbol_to_eol_type (eol_type));
+}
+
+\f
+/************************************************************************/
+/*                         Coding system accessors                      */
+/************************************************************************/
+
+DEFUN ("coding-system-doc-string", Fcoding_system_doc_string, 1, 1, 0, /*
+Return the doc string for CODING-SYSTEM.
+*/
+       (coding_system))
+{
+  coding_system = Fget_coding_system (coding_system);
+  return XCODING_SYSTEM_DOC_STRING (coding_system);
+}
+
+DEFUN ("coding-system-type", Fcoding_system_type, 1, 1, 0, /*
+Return the type of CODING-SYSTEM.
+*/
+       (coding_system))
+{
+  switch (XCODING_SYSTEM_TYPE (Fget_coding_system (coding_system)))
+    {
+    case CODESYS_AUTODETECT:   return Qundecided;
+    case CODESYS_SHIFT_JIS:    return Qshift_jis;
+    case CODESYS_ISO2022:      return Qiso2022;
+    case CODESYS_BIG5:         return Qbig5;
+    case CODESYS_CCL:          return Qccl;
+    case CODESYS_NO_CONVERSION:        return Qno_conversion;
+#ifdef DEBUG_XEMACS
+    case CODESYS_INTERNAL:     return Qinternal;
+#endif
+    default:
+      abort ();
+    }
+
+  return Qnil; /* not reached */
+}
+
+static
+Lisp_Object coding_system_charset (Lisp_Object coding_system, int gnum)
+{
+  Lisp_Object cs
+    = XCODING_SYSTEM_ISO2022_INITIAL_CHARSET (coding_system, gnum);
+
+  return CHARSETP (cs) ? XCHARSET_NAME (cs) : Qnil;
+}
+
+DEFUN ("coding-system-charset", Fcoding_system_charset, 2, 2, 0, /*
+Return initial charset of CODING-SYSTEM designated to GNUM.
+GNUM allows 0 .. 3.
+*/
+       (coding_system, gnum))
+{
+  coding_system = Fget_coding_system (coding_system);
+  CHECK_INT (gnum);
+
+  return coding_system_charset (coding_system, XINT (gnum));
+}
+
+DEFUN ("coding-system-property", Fcoding_system_property, 2, 2, 0, /*
+Return the PROP property of CODING-SYSTEM.
+*/
+       (coding_system, prop))
+{
+  int i, ok = 0;
+  enum coding_system_type type;
+
+  coding_system = Fget_coding_system (coding_system);
+  CHECK_SYMBOL (prop);
+  type = XCODING_SYSTEM_TYPE (coding_system);
+
+  for (i = 0; !ok && i < Dynarr_length (the_codesys_prop_dynarr); i++)
+    if (EQ (Dynarr_at (the_codesys_prop_dynarr, i).sym, prop))
+      {
+       ok = 1;
+       switch (Dynarr_at (the_codesys_prop_dynarr, i).prop_type)
+         {
+         case CODESYS_PROP_ALL_OK:
+           break;
+
+         case CODESYS_PROP_ISO2022:
+           if (type != CODESYS_ISO2022)
+             signal_simple_error
+               ("Property only valid in ISO2022 coding systems",
+                prop);
+           break;
+
+         case CODESYS_PROP_CCL:
+           if (type != CODESYS_CCL)
+             signal_simple_error
+               ("Property only valid in CCL coding systems",
+                prop);
+           break;
+
+         default:
+           abort ();
+         }
+      }
+
+  if (!ok)
+    signal_simple_error ("Unrecognized property", prop);
+
+  if (EQ (prop, Qname))
+    return XCODING_SYSTEM_NAME (coding_system);
+  else if (EQ (prop, Qtype))
+    return Fcoding_system_type (coding_system);
+  else if (EQ (prop, Qdoc_string))
+    return XCODING_SYSTEM_DOC_STRING (coding_system);
+  else if (EQ (prop, Qmnemonic))
+    return XCODING_SYSTEM_MNEMONIC (coding_system);
+  else if (EQ (prop, Qeol_type))
+    return eol_type_to_symbol (XCODING_SYSTEM_EOL_TYPE (coding_system));
+  else if (EQ (prop, Qeol_lf))
+    return XCODING_SYSTEM_EOL_LF (coding_system);
+  else if (EQ (prop, Qeol_crlf))
+    return XCODING_SYSTEM_EOL_CRLF (coding_system);
+  else if (EQ (prop, Qeol_cr))
+    return XCODING_SYSTEM_EOL_CR (coding_system);
+  else if (EQ (prop, Qpost_read_conversion))
+    return XCODING_SYSTEM_POST_READ_CONVERSION (coding_system);
+  else if (EQ (prop, Qpre_write_conversion))
+    return XCODING_SYSTEM_PRE_WRITE_CONVERSION (coding_system);
+  else if (type == CODESYS_ISO2022)
+    {
+      if (EQ (prop, Qcharset_g0))
+       return coding_system_charset (coding_system, 0);
+      else if (EQ (prop, Qcharset_g1))
+       return coding_system_charset (coding_system, 1);
+      else if (EQ (prop, Qcharset_g2))
+       return coding_system_charset (coding_system, 2);
+      else if (EQ (prop, Qcharset_g3))
+       return coding_system_charset (coding_system, 3);
+
+#define FORCE_CHARSET(charset_num) \
+  (XCODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT \
+   (coding_system, charset_num) ? Qt : Qnil)
+
+      else if (EQ (prop, Qforce_g0_on_output)) return FORCE_CHARSET (0);
+      else if (EQ (prop, Qforce_g1_on_output)) return FORCE_CHARSET (1);
+      else if (EQ (prop, Qforce_g2_on_output)) return FORCE_CHARSET (2);
+      else if (EQ (prop, Qforce_g3_on_output)) return FORCE_CHARSET (3);
+
+#define LISP_BOOLEAN(prop) \
+  (XCODING_SYSTEM_ISO2022_##prop (coding_system) ? Qt : Qnil)
+
+      else if (EQ (prop, Qshort))         return LISP_BOOLEAN (SHORT);
+      else if (EQ (prop, Qno_ascii_eol))  return LISP_BOOLEAN (NO_ASCII_EOL);
+      else if (EQ (prop, Qno_ascii_cntl)) return LISP_BOOLEAN (NO_ASCII_CNTL);
+      else if (EQ (prop, Qseven))         return LISP_BOOLEAN (SEVEN);
+      else if (EQ (prop, Qlock_shift))    return LISP_BOOLEAN (LOCK_SHIFT);
+      else if (EQ (prop, Qno_iso6429))    return LISP_BOOLEAN (NO_ISO6429);
+      else if (EQ (prop, Qescape_quoted)) return LISP_BOOLEAN (ESCAPE_QUOTED);
+
+      else if (EQ (prop, Qinput_charset_conversion))
+       return
+         unparse_charset_conversion_specs
+           (XCODING_SYSTEM (coding_system)->iso2022.input_conv);
+      else if (EQ (prop, Qoutput_charset_conversion))
+       return
+         unparse_charset_conversion_specs
+           (XCODING_SYSTEM (coding_system)->iso2022.output_conv);
+      else
+       abort ();
+    }
+  else if (type == CODESYS_CCL)
+    {
+      if (EQ (prop, Qdecode))
+       return XCODING_SYSTEM_CCL_DECODE (coding_system);
+      else if (EQ (prop, Qencode))
+       return XCODING_SYSTEM_CCL_ENCODE (coding_system);
+      else
+       abort ();
+    }
+  else
+    abort ();
+
+  return Qnil; /* not reached */
+}
+
+\f
+/************************************************************************/
+/*                       Coding category functions                      */
+/************************************************************************/
+
+static int
+decode_coding_category (Lisp_Object symbol)
+{
+  int i;
+
+  CHECK_SYMBOL (symbol);
+  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+    if (EQ (coding_category_symbol[i], symbol))
+      return i;
+
+  signal_simple_error ("Unrecognized coding category", symbol);
+  return 0; /* not reached */
+}
+
+DEFUN ("coding-category-list", Fcoding_category_list, 0, 0, 0, /*
+Return a list of all recognized coding categories.
+*/
+       ())
+{
+  int i;
+  Lisp_Object list = Qnil;
+
+  for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+    list = Fcons (coding_category_symbol[i], list);
+  return list;
+}
+
+DEFUN ("set-coding-priority-list", Fset_coding_priority_list, 1, 1, 0, /*
+Change the priority order of the coding categories.
+LIST should be list of coding categories, in descending order of
+priority.  Unspecified coding categories will be lower in priority
+than all specified ones, in the same relative order they were in
+previously.
+*/
+       (list))
+{
+  int category_to_priority[CODING_CATEGORY_LAST + 1];
+  int i, j;
+  Lisp_Object rest;
+
+  /* First generate a list that maps coding categories to priorities. */
+
+  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+    category_to_priority[i] = -1;
+
+  /* Highest priority comes from the specified list. */
+  i = 0;
+  EXTERNAL_LIST_LOOP (rest, list)
+    {
+      int cat = decode_coding_category (XCAR (rest));
+
+      if (category_to_priority[cat] >= 0)
+       signal_simple_error ("Duplicate coding category in list", XCAR (rest));
+      category_to_priority[cat] = i++;
+    }
+
+  /* Now go through the existing categories by priority to retrieve
+     the categories not yet specified and preserve their priority
+     order. */
+  for (j = 0; j <= CODING_CATEGORY_LAST; j++)
+    {
+      int cat = coding_category_by_priority[j];
+      if (category_to_priority[cat] < 0)
+       category_to_priority[cat] = i++;
+    }
+
+  /* Now we need to construct the inverse of the mapping we just
+     constructed. */
+
+  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+    coding_category_by_priority[category_to_priority[i]] = i;
+
+  /* Phew!  That was confusing. */
+  return Qnil;
+}
+
+DEFUN ("coding-priority-list", Fcoding_priority_list, 0, 0, 0, /*
+Return a list of coding categories in descending order of priority.
+*/
+       ())
+{
+  int i;
+  Lisp_Object list = Qnil;
+
+  for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+    list = Fcons (coding_category_symbol[coding_category_by_priority[i]],
+                 list);
+  return list;
+}
+
+DEFUN ("set-coding-category-system", Fset_coding_category_system, 2, 2, 0, /*
+Change the coding system associated with a coding category.
+*/
+       (coding_category, coding_system))
+{
+  int cat = decode_coding_category (coding_category);
+
+  coding_system = Fget_coding_system (coding_system);
+  coding_category_system[cat] = coding_system;
+  return Qnil;
+}
+
+DEFUN ("coding-category-system", Fcoding_category_system, 1, 1, 0, /*
+Return the coding system associated with a coding category.
+*/
+       (coding_category))
+{
+  int cat = decode_coding_category (coding_category);
+  Lisp_Object sys = coding_category_system[cat];
+
+  if (!NILP (sys))
+    return XCODING_SYSTEM_NAME (sys);
+  return Qnil;
+}
+
+\f
+/************************************************************************/
+/*                     Detecting the encoding of data                   */
+/************************************************************************/
+
+struct detection_state
+{
+  enum eol_type eol_type;
+  int seen_non_ascii;
+  int mask;
+
+  struct
+  {
+    int mask;
+    int in_second_byte;
+  }
+  big5;
+
+  struct
+  {
+    int mask;
+    int in_second_byte;
+  }
+  shift_jis;
+
+  struct
+  {
+    int mask;
+    int initted;
+    struct iso2022_decoder iso;
+    unsigned int flags;
+    int high_byte_count;
+    unsigned int saw_single_shift:1;
+  }
+  iso2022;
+
+  struct
+  {
+    int seen_anything;
+    int just_saw_cr;
+  }
+  eol;
+};
+
+static int
+acceptable_control_char_p (int c)
+{
+  switch (c)
+    {
+      /* Allow and ignore control characters that you might
+        reasonably see in a text file */
+    case '\r':
+    case '\n':
+    case '\t':
+    case  7: /* bell */
+    case  8: /* backspace */
+    case 11: /* vertical tab */
+    case 12: /* form feed */
+    case 26: /* MS-DOS C-z junk */
+    case 31: /* '^_' -- for info */
+      return 1;
+    default:
+      return 0;
+    }
+}
+
+static int
+mask_has_at_most_one_bit_p (int mask)
+{
+  /* Perhaps the only thing useful you learn from intensive Microsoft
+     technical interviews */
+  return (mask & (mask - 1)) == 0;
+}
+
+static enum eol_type
+detect_eol_type (struct detection_state *st, CONST unsigned char *src,
+                unsigned int n)
+{
+  int c;
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == '\r')
+       st->eol.just_saw_cr = 1;
+      else
+       {
+         if (c == '\n')
+           {
+             if (st->eol.just_saw_cr)
+               return EOL_CRLF;
+             else if (st->eol.seen_anything)
+               return EOL_LF;
+           }
+         else if (st->eol.just_saw_cr)
+           return EOL_CR;
+         st->eol.just_saw_cr = 0;
+       }
+      st->eol.seen_anything = 1;
+    }
+
+  return EOL_AUTODETECT;
+}
+
+/* Attempt to determine the encoding and EOL type of the given text.
+   Before calling this function for the first type, you must initialize
+   st->eol_type as appropriate and initialize st->mask to ~0.
+
+   st->eol_type holds the determined EOL type, or EOL_AUTODETECT if
+   not yet known.
+
+   st->mask holds the determined coding category mask, or ~0 if only
+   ASCII has been seen so far.
+
+   Returns:
+
+   0 == st->eol_type is EOL_AUTODETECT and/or more than coding category
+        is present in st->mask
+   1 == definitive answers are here for both st->eol_type and st->mask
+*/
+
+static int
+detect_coding_type (struct detection_state *st, CONST unsigned char *src,
+                   unsigned int n, int just_do_eol)
+{
+  int c;
+
+  if (st->eol_type == EOL_AUTODETECT)
+    st->eol_type = detect_eol_type (st, src, n);
+
+  if (just_do_eol)
+    return st->eol_type != EOL_AUTODETECT;
+
+  if (!st->seen_non_ascii)
+    {
+      for (; n; n--, src++)
+       {
+         c = *src;
+         if ((c < 0x20 && !acceptable_control_char_p (c)) || c >= 0x80)
+           {
+             st->seen_non_ascii = 1;
+             st->shift_jis.mask = ~0;
+             st->big5.mask = ~0;
+             st->iso2022.mask = ~0;
+             break;
+           }
+       }
+    }
+
+  if (!n)
+    return 0;
+
+  if (!mask_has_at_most_one_bit_p (st->iso2022.mask))
+    st->iso2022.mask = detect_coding_iso2022 (st, src, n);
+  if (!mask_has_at_most_one_bit_p (st->shift_jis.mask))
+    st->shift_jis.mask = detect_coding_sjis (st, src, n);
+  if (!mask_has_at_most_one_bit_p (st->big5.mask))
+    st->big5.mask = detect_coding_big5 (st, src, n);
+
+  st->mask = st->iso2022.mask | st->shift_jis.mask | st->big5.mask;
+
+  {
+    int retval = mask_has_at_most_one_bit_p (st->mask);
+    st->mask |= CODING_CATEGORY_NO_CONVERSION_MASK;
+    return retval && st->eol_type != EOL_AUTODETECT;
+  }
+}
+
+static Lisp_Object
+coding_system_from_mask (int mask)
+{
+  if (mask == ~0)
+    {
+      /* If the file was entirely or basically ASCII, use the
+        default value of `buffer-file-coding-system'. */
+      Lisp_Object retval =
+       XBUFFER (Vbuffer_defaults)->buffer_file_coding_system;
+      if (!NILP (retval))
+       {
+         retval = Ffind_coding_system (retval);
+         if (NILP (retval))
+           {
+             warn_when_safe
+               (Qbad_variable, Qwarning,
+                "Invalid `default-buffer-file-coding-system', set to nil");
+             XBUFFER (Vbuffer_defaults)->buffer_file_coding_system = Qnil;
+           }
+       }
+      if (NILP (retval))
+       retval = Fget_coding_system (Qno_conversion);
+      return retval;
+    }
+  else
+    {
+      int i;
+      int cat = -1;
+
+      mask = postprocess_iso2022_mask (mask);
+
+      /* Look through the coding categories by priority and find
+        the first one that is allowed. */
+      for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+       {
+         cat = coding_category_by_priority[i];
+         if ((mask & (1 << cat)) &&
+             !NILP (coding_category_system[cat]))
+           break;
+       }
+      if (cat >= 0)
+       return coding_category_system[cat];
+      else
+       return Fget_coding_system (Qno_conversion);
+    }
+}
+
+/* Given a seekable read stream and potential coding system and EOL type
+   as specified, do any autodetection that is called for.  If the
+   coding system and/or EOL type are not autodetect, they will be left
+   alone; but this function will never return an autodetect coding system
+   or EOL type.
+
+   This function does not automatically fetch subsidiary coding systems;
+   that should be unnecessary with the explicit eol-type argument. */
+
+void
+determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
+                             enum eol_type *eol_type_in_out)
+{
+  struct detection_state decst;
+
+  if (*eol_type_in_out == EOL_AUTODETECT)
+    *eol_type_in_out = XCODING_SYSTEM_EOL_TYPE (*codesys_in_out);
+
+  xzero (decst);
+  decst.eol_type = *eol_type_in_out;
+  decst.mask = ~0;
+
+  /* If autodetection is called for, do it now. */
+  if (XCODING_SYSTEM_TYPE (*codesys_in_out) == CODESYS_AUTODETECT ||
+      *eol_type_in_out == EOL_AUTODETECT)
+    {
+
+      while (1)
+       {
+         unsigned char random_buffer[4096];
+         int nread;
+
+         nread = Lstream_read (stream, random_buffer, sizeof (random_buffer));
+         if (!nread)
+           break;
+         if (detect_coding_type (&decst, random_buffer, nread,
+                                 XCODING_SYSTEM_TYPE (*codesys_in_out) !=
+                                 CODESYS_AUTODETECT))
+           break;
+       }
+
+      *eol_type_in_out = decst.eol_type;
+      if (XCODING_SYSTEM_TYPE (*codesys_in_out) == CODESYS_AUTODETECT)
+       *codesys_in_out = coding_system_from_mask (decst.mask);
+    }
+
+  /* If we absolutely can't determine the EOL type, just assume LF. */
+  if (*eol_type_in_out == EOL_AUTODETECT)
+    *eol_type_in_out = EOL_LF;
+
+  Lstream_rewind (stream);
+}
+
+DEFUN ("detect-coding-region", Fdetect_coding_region, 2, 3, 0, /*
+Detect coding system of the text in the region between START and END.
+Returned a list of possible coding systems ordered by priority.
+If only ASCII characters are found, it returns 'undecided or one of
+its subsidiary coding systems according to a detected end-of-line
+type.  Optional arg BUFFER defaults to the current buffer.
+*/
+       (start, end, buffer))
+{
+  Lisp_Object val = Qnil;
+  struct buffer *buf = decode_buffer (buffer, 0);
+  Bufpos b, e;
+  Lisp_Object instream, lb_instream;
+  Lstream *istr, *lb_istr;
+  struct detection_state decst;
+  struct gcpro gcpro1, gcpro2;
+
+  get_buffer_range_char (buf, start, end, &b, &e, 0);
+  lb_instream = make_lisp_buffer_input_stream (buf, b, e, 0);
+  lb_istr = XLSTREAM (lb_instream);
+  instream = make_encoding_input_stream (lb_istr, Fget_coding_system (Qbinary));
+  istr = XLSTREAM (instream);
+  GCPRO2 (instream, lb_instream);
+  xzero (decst);
+  decst.eol_type = EOL_AUTODETECT;
+  decst.mask = ~0;
+  while (1)
+    {
+      unsigned char random_buffer[4096];
+      int nread = Lstream_read (istr, random_buffer, sizeof (random_buffer));
+
+      if (!nread)
+       break;
+      if (detect_coding_type (&decst, random_buffer, nread, 0))
+       break;
+    }
+
+  if (decst.mask == ~0)
+    val = subsidiary_coding_system (Fget_coding_system (Qundecided),
+                                   decst.eol_type);
+  else
+    {
+      int i;
+
+      val = Qnil;
+
+      decst.mask = postprocess_iso2022_mask (decst.mask);
+
+      for (i = CODING_CATEGORY_LAST; i >= 0; i--)
+       {
+         int sys = coding_category_by_priority[i];
+         if (decst.mask & (1 << sys))
+           {
+             Lisp_Object codesys = coding_category_system[sys];
+             if (!NILP (codesys))
+               codesys = subsidiary_coding_system (codesys, decst.eol_type);
+             val = Fcons (codesys, val);
+           }
+       }
+    }
+  Lstream_close (istr);
+  UNGCPRO;
+  Lstream_delete (istr);
+  Lstream_delete (lb_istr);
+  return val;
+}
+
+\f
+/************************************************************************/
+/*           Converting to internal Mule format ("decoding")            */
+/************************************************************************/
+
+/* A decoding stream is a stream used for decoding text (i.e.
+   converting from some external format to internal format).
+   The decoding-stream object keeps track of the actual coding
+   stream, the stream that is at the other end, and data that
+   needs to be persistent across the lifetime of the stream. */
+
+/* Handle the EOL stuff related to just-read-in character C.
+   EOL_TYPE is the EOL type of the coding stream.
+   FLAGS is the current value of FLAGS in the coding stream, and may
+   be modified by this macro.  (The macro only looks at the
+   CODING_STATE_CR flag.)  DST is the Dynarr to which the decoded
+   bytes are to be written.  You need to also define a local goto
+   label "label_continue_loop" that is at the end of the main
+   character-reading loop.
+
+   If C is a CR character, then this macro handles it entirely and
+   jumps to label_continue_loop.  Otherwise, this macro does not add
+   anything to DST, and continues normally.  You should continue
+   processing C normally after this macro. */
+
+#define DECODE_HANDLE_EOL_TYPE(eol_type, c, flags, dst)                \
+do {                                                           \
+  if (c == '\r')                                               \
+    {                                                          \
+      if (eol_type == EOL_CR)                                  \
+       Dynarr_add (dst, '\n');                                 \
+      else if (eol_type != EOL_CRLF || flags & CODING_STATE_CR)        \
+       Dynarr_add (dst, c);                                    \
+      else                                                     \
+       flags |= CODING_STATE_CR;                               \
+      goto label_continue_loop;                                        \
+    }                                                          \
+  else if (flags & CODING_STATE_CR)                            \
+    {  /* eol_type == CODING_SYSTEM_EOL_CRLF */                \
+      if (c != '\n')                                           \
+       Dynarr_add (dst, '\r');                                 \
+      flags &= ~CODING_STATE_CR;                               \
+    }                                                          \
+} while (0)
+
+/* C should be a binary character in the range 0 - 255; convert
+   to internal format and add to Dynarr DST. */
+
+#define DECODE_ADD_BINARY_CHAR(c, dst)         \
+do {                                           \
+  if (BYTE_ASCII_P (c))                                \
+    Dynarr_add (dst, c);                       \
+  else if (BYTE_C1_P (c))                      \
+    {                                          \
+      Dynarr_add (dst, LEADING_BYTE_CONTROL_1);        \
+      Dynarr_add (dst, c + 0x20);              \
+    }                                          \
+  else                                         \
+    {                                          \
+      Dynarr_add (dst, LEADING_BYTE_LATIN_ISO8859_1); \
+      Dynarr_add (dst, c);                     \
+    }                                          \
+} while (0)
+
+#define DECODE_OUTPUT_PARTIAL_CHAR(ch) \
+do {                                   \
+  if (ch)                              \
+    {                                  \
+      DECODE_ADD_BINARY_CHAR (ch, dst);        \
+      ch = 0;                          \
+    }                                  \
+} while (0)
+
+#define DECODE_HANDLE_END_OF_CONVERSION(flags, ch, dst)        \
+do {                                   \
+  DECODE_OUTPUT_PARTIAL_CHAR (ch);     \
+  if ((flags & CODING_STATE_END) &&    \
+      (flags & CODING_STATE_CR))       \
+    Dynarr_add (dst, '\r');            \
+} while (0)
+
+#define DECODING_STREAM_DATA(stream) LSTREAM_TYPE_DATA (stream, decoding)
+
+struct decoding_stream
+{
+  /* Coding system that governs the conversion. */
+  struct Lisp_Coding_System *codesys;
+
+  /* Stream that we read the encoded data from or
+     write the decoded data to. */
+  Lstream *other_end;
+
+  /* If we are reading, then we can return only a fixed amount of
+     data, so if the conversion resulted in too much data, we store it
+     here for retrieval the next time around. */
+  unsigned_char_dynarr *runoff;
+
+  /* FLAGS holds flags indicating the current state of the decoding.
+     Some of these flags are dependent on the coding system. */
+  unsigned int flags;
+
+  /* CH holds a partially built-up character.  Since we only deal
+     with one- and two-byte characters at the moment, we only use
+     this to store the first byte of a two-byte character. */
+  unsigned int ch;
+
+  /* EOL_TYPE specifies the type of end-of-line conversion that
+     currently applies.  We need to keep this separate from the
+     EOL type stored in CODESYS because the latter might indicate
+     automatic EOL-type detection while the former will always
+     indicate a particular EOL type. */
+  enum eol_type eol_type;
+
+  /* Additional ISO2022 information.  We define the structure above
+     because it's also needed by the detection routines. */
+  struct iso2022_decoder iso2022;
+
+  /* Additional information (the state of the running CCL program)
+     used by the CCL decoder. */
+  struct ccl_program ccl;
+
+  struct detection_state decst;
+};
+
+static int decoding_reader     (Lstream *stream,       unsigned char *data, size_t size);
+static int decoding_writer     (Lstream *stream, CONST unsigned char *data, size_t size);
+static int decoding_rewinder   (Lstream *stream);
+static int decoding_seekable_p (Lstream *stream);
+static int decoding_flusher    (Lstream *stream);
+static int decoding_closer     (Lstream *stream);
+static Lisp_Object decoding_marker (Lisp_Object stream,
+                                   void (*markobj) (Lisp_Object));
+
+DEFINE_LSTREAM_IMPLEMENTATION ("decoding", lstream_decoding,
+                              sizeof (struct decoding_stream));
+
+static Lisp_Object
+decoding_marker (Lisp_Object stream, void (*markobj) (Lisp_Object))
+{
+  Lstream *str = DECODING_STREAM_DATA (XLSTREAM (stream))->other_end;
+  Lisp_Object str_obj;
+
+  /* We do not need to mark the coding systems or charsets stored
+     within the stream because they are stored in a global list
+     and automatically marked. */
+
+  XSETLSTREAM (str_obj, str);
+  (markobj) (str_obj);
+  if (str->imp->marker)
+    return (str->imp->marker) (str_obj, markobj);
+  else
+    return Qnil;
+}
+
+/* Read SIZE bytes of data and store it into DATA.  We are a decoding stream
+   so we read data from the other end, decode it, and store it into DATA. */
+
+static int
+decoding_reader (Lstream *stream, unsigned char *data, size_t size)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  unsigned char *orig_data = data;
+  int read_size;
+  int error_occurred = 0;
+
+  /* We need to interface to mule_decode(), which expects to take some
+     amount of data and store the result into a Dynarr.  We have
+     mule_decode() store into str->runoff, and take data from there
+     as necessary. */
+
+  /* We loop until we have enough data, reading chunks from the other
+     end and decoding it. */
+  while (1)
+    {
+      /* Take data from the runoff if we can.  Make sure to take at
+        most SIZE bytes, and delete the data from the runoff. */
+      if (Dynarr_length (str->runoff) > 0)
+       {
+         size_t chunk = min (size, (size_t) Dynarr_length (str->runoff));
+         memcpy (data, Dynarr_atp (str->runoff, 0), chunk);
+         Dynarr_delete_many (str->runoff, 0, chunk);
+         data += chunk;
+         size -= chunk;
+       }
+
+      if (size == 0)
+       break; /* No more room for data */
+
+      if (str->flags & CODING_STATE_END)
+       /* This means that on the previous iteration, we hit the EOF on
+          the other end.  We loop once more so that mule_decode() can
+          output any final stuff it may be holding, or any "go back
+          to a sane state" escape sequences. (This latter makes sense
+          during encoding.) */
+       break;
+
+      /* Exhausted the runoff, so get some more.  DATA has at least
+        SIZE bytes left of storage in it, so it's OK to read directly
+        into it.  (We'll be overwriting above, after we've decoded it
+        into the runoff.) */
+      read_size = Lstream_read (str->other_end, data, size);
+      if (read_size < 0)
+       {
+         error_occurred = 1;
+         break;
+       }
+      if (read_size == 0)
+       /* There might be some more end data produced in the translation.
+          See the comment above. */
+       str->flags |= CODING_STATE_END;
+      mule_decode (stream, data, str->runoff, read_size);
+    }
+
+  if (data - orig_data == 0)
+    return error_occurred ? -1 : 0;
+  else
+    return data - orig_data;
+}
+
+static int
+decoding_writer (Lstream *stream, CONST unsigned char *data, size_t size)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  int retval;
+
+  /* Decode all our data into the runoff, and then attempt to write
+     it all out to the other end.  Remove whatever chunk we succeeded
+     in writing. */
+  mule_decode (stream, data, str->runoff, size);
+  retval = Lstream_write (str->other_end, Dynarr_atp (str->runoff, 0),
+                         Dynarr_length (str->runoff));
+  if (retval > 0)
+    Dynarr_delete_many (str->runoff, 0, retval);
+  /* Do NOT return retval.  The return value indicates how much
+     of the incoming data was written, not how many bytes were
+     written. */
+  return size;
+}
+
+static void
+reset_decoding_stream (struct decoding_stream *str)
+{
+  if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_ISO2022)
+    {
+      Lisp_Object coding_system;
+      XSETCODING_SYSTEM (coding_system, str->codesys);
+      reset_iso2022 (coding_system, &str->iso2022);
+    }
+  else if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_CCL)
+    {
+      setup_ccl_program (&str->ccl, CODING_SYSTEM_CCL_DECODE (str->codesys));
+    }
+
+  str->flags = str->ch = 0;
+}
+
+static int
+decoding_rewinder (Lstream *stream)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  reset_decoding_stream (str);
+  Dynarr_reset (str->runoff);
+  return Lstream_rewind (str->other_end);
+}
+
+static int
+decoding_seekable_p (Lstream *stream)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  return Lstream_seekable_p (str->other_end);
+}
+
+static int
+decoding_flusher (Lstream *stream)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  return Lstream_flush (str->other_end);
+}
+
+static int
+decoding_closer (Lstream *stream)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+  if (stream->flags & LSTREAM_FL_WRITE)
+    {
+      str->flags |= CODING_STATE_END;
+      decoding_writer (stream, 0, 0);
+    }
+  Dynarr_free (str->runoff);
+  if (str->iso2022.composite_chars)
+    Dynarr_free (str->iso2022.composite_chars);
+  return Lstream_close (str->other_end);
+}
+
+Lisp_Object
+decoding_stream_coding_system (Lstream *stream)
+{
+  Lisp_Object coding_system;
+  struct decoding_stream *str = DECODING_STREAM_DATA (stream);
+
+  XSETCODING_SYSTEM (coding_system, str->codesys);
+  return subsidiary_coding_system (coding_system, str->eol_type);
+}
+
+void
+set_decoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
+{
+  struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+  struct decoding_stream *str = DECODING_STREAM_DATA (lstr);
+  str->codesys = cs;
+  if (CODING_SYSTEM_EOL_TYPE (cs) != EOL_AUTODETECT)
+    str->eol_type = CODING_SYSTEM_EOL_TYPE (cs);
+  reset_decoding_stream (str);
+}
+
+/* WARNING WARNING WARNING WARNING!!!!!  If you open up a decoding
+   stream for writing, no automatic code detection will be performed.
+   The reason for this is that automatic code detection requires a
+   seekable input.  Things will also fail if you open a decoding
+   stream for reading using a non-fully-specified coding system and
+   a non-seekable input stream. */
+
+static Lisp_Object
+make_decoding_stream_1 (Lstream *stream, Lisp_Object codesys,
+                       CONST char *mode)
+{
+  Lstream *lstr = Lstream_new (lstream_decoding, mode);
+  struct decoding_stream *str = DECODING_STREAM_DATA (lstr);
+  Lisp_Object obj;
+
+  xzero (*str);
+  str->other_end = stream;
+  str->runoff = (unsigned_char_dynarr *) Dynarr_new (unsigned_char);
+  str->eol_type = EOL_AUTODETECT;
+  if (!strcmp (mode, "r")
+      && Lstream_seekable_p (stream))
+    /* We can determine the coding system now. */
+    determine_real_coding_system (stream, &codesys, &str->eol_type);
+  set_decoding_stream_coding_system (lstr, codesys);
+  str->decst.eol_type = str->eol_type;
+  str->decst.mask = ~0;
+  XSETLSTREAM (obj, lstr);
+  return obj;
+}
+
+Lisp_Object
+make_decoding_input_stream (Lstream *stream, Lisp_Object codesys)
+{
+  return make_decoding_stream_1 (stream, codesys, "r");
+}
+
+Lisp_Object
+make_decoding_output_stream (Lstream *stream, Lisp_Object codesys)
+{
+  return make_decoding_stream_1 (stream, codesys, "w");
+}
+
+/* Note: the decode_coding_* functions all take the same
+   arguments as mule_decode(), which is to say some SRC data of
+   size N, which is to be stored into dynamic array DST.
+   DECODING is the stream within which the decoding is
+   taking place, but no data is actually read from or
+   written to that stream; that is handled in decoding_reader()
+   or decoding_writer().  This allows the same functions to
+   be used for both reading and writing. */
+
+static void
+mule_decode (Lstream *decoding, CONST unsigned char *src,
+            unsigned_char_dynarr *dst, unsigned int n)
+{
+  struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+  /* If necessary, do encoding-detection now.  We do this when
+     we're a writing stream or a non-seekable reading stream,
+     meaning that we can't just process the whole input,
+     rewind, and start over. */
+
+  if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT ||
+      str->eol_type == EOL_AUTODETECT)
+    {
+      Lisp_Object codesys;
+
+      XSETCODING_SYSTEM (codesys, str->codesys);
+      detect_coding_type (&str->decst, src, n,
+                         CODING_SYSTEM_TYPE (str->codesys) !=
+                         CODESYS_AUTODETECT);
+      if (CODING_SYSTEM_TYPE (str->codesys) == CODESYS_AUTODETECT &&
+         str->decst.mask != ~0)
+       /* #### This is cheesy.  What we really ought to do is
+          buffer up a certain amount of data so as to get a
+          less random result. */
+       codesys = coding_system_from_mask (str->decst.mask);
+      str->eol_type = str->decst.eol_type;
+      if (XCODING_SYSTEM (codesys) != str->codesys)
+       {
+         /* Preserve the CODING_STATE_END flag in case it was set.
+            If we erase it, bad things might happen. */
+         int was_end = str->flags & CODING_STATE_END;
+          set_decoding_stream_coding_system (decoding, codesys);
+         if (was_end)
+           str->flags |= CODING_STATE_END;
+       }
+    }
+
+  switch (CODING_SYSTEM_TYPE (str->codesys))
+    {
+#ifdef DEBUG_XEMACS
+    case CODESYS_INTERNAL:
+      Dynarr_add_many (dst, src, n);
+      break;
+#endif
+    case CODESYS_AUTODETECT:
+      /* If we got this far and still haven't decided on the coding
+        system, then do no conversion. */
+    case CODESYS_NO_CONVERSION:
+      decode_coding_no_conversion (decoding, src, dst, n);
+      break;
+    case CODESYS_SHIFT_JIS:
+      decode_coding_sjis (decoding, src, dst, n);
+      break;
+    case CODESYS_BIG5:
+      decode_coding_big5 (decoding, src, dst, n);
+      break;
+    case CODESYS_CCL:
+      ccl_driver (&str->ccl, src, dst, n, 0);
+      break;
+    case CODESYS_ISO2022:
+      decode_coding_iso2022 (decoding, src, dst, n);
+      break;
+    default:
+      abort ();
+    }
+}
+
+DEFUN ("decode-coding-region", Fdecode_coding_region, 3, 4, 0, /*
+Decode the text between START and END which is encoded in CODING-SYSTEM.
+This is useful if you've read in encoded text from a file without decoding
+it (e.g. you read in a JIS-formatted file but used the `binary' or
+`no-conversion' coding system, so that it shows up as "^[$B!<!+^[(B").
+Return length of decoded text.
+BUFFER defaults to the current buffer if unspecified.
+*/
+       (start, end, coding_system, buffer))
+{
+  Bufpos b, e;
+  struct buffer *buf = decode_buffer (buffer, 0);
+  Lisp_Object instream, lb_outstream, de_outstream, outstream;
+  Lstream *istr, *ostr;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+  get_buffer_range_char (buf, start, end, &b, &e, 0);
+
+  barf_if_buffer_read_only (buf, b, e);
+
+  coding_system = Fget_coding_system (coding_system);
+  instream = make_lisp_buffer_input_stream  (buf, b, e, 0);
+  lb_outstream = make_lisp_buffer_output_stream (buf, b, 0);
+  de_outstream = make_decoding_output_stream (XLSTREAM (lb_outstream),
+                                             coding_system);
+  outstream = make_encoding_output_stream (XLSTREAM (de_outstream),
+                                          Fget_coding_system (Qbinary));
+  istr = XLSTREAM (instream);
+  ostr = XLSTREAM (outstream);
+  GCPRO4 (instream, lb_outstream, de_outstream, outstream);
+
+  /* The chain of streams looks like this:
+
+     [BUFFER] <----- send through
+                     ------> [ENCODE AS BINARY]
+                            ------> [DECODE AS SPECIFIED]
+                                    ------> [BUFFER]
+   */
+
+  while (1)
+    {
+      char tempbuf[1024]; /* some random amount */
+      Bufpos newpos, even_newer_pos;
+      Bufpos oldpos = lisp_buffer_stream_startpos (istr);
+      int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+
+      if (!size_in_bytes)
+       break;
+      newpos = lisp_buffer_stream_startpos (istr);
+      Lstream_write (ostr, tempbuf, size_in_bytes);
+      even_newer_pos = lisp_buffer_stream_startpos (istr);
+      buffer_delete_range (buf, even_newer_pos - (newpos - oldpos),
+                          even_newer_pos, 0);
+    }
+  Lstream_close (istr);
+  Lstream_close (ostr);
+  UNGCPRO;
+  Lstream_delete (istr);
+  Lstream_delete (ostr);
+  Lstream_delete (XLSTREAM (de_outstream));
+  Lstream_delete (XLSTREAM (lb_outstream));
+  return Qnil;
+}
+
+\f
+/************************************************************************/
+/*           Converting to an external encoding ("encoding")            */
+/************************************************************************/
+
+/* An encoding stream is an output stream.  When you create the
+   stream, you specify the coding system that governs the encoding
+   and another stream that the resulting encoded data is to be
+   sent to, and then start sending data to it. */
+
+#define ENCODING_STREAM_DATA(stream) LSTREAM_TYPE_DATA (stream, encoding)
+
+struct encoding_stream
+{
+  /* Coding system that governs the conversion. */
+  struct Lisp_Coding_System *codesys;
+
+  /* Stream that we read the encoded data from or
+     write the decoded data to. */
+  Lstream *other_end;
+
+  /* If we are reading, then we can return only a fixed amount of
+     data, so if the conversion resulted in too much data, we store it
+     here for retrieval the next time around. */
+  unsigned_char_dynarr *runoff;
+
+  /* FLAGS holds flags indicating the current state of the encoding.
+     Some of these flags are dependent on the coding system. */
+  unsigned int flags;
+
+  /* CH holds a partially built-up character.  Since we only deal
+     with one- and two-byte characters at the moment, we only use
+     this to store the first byte of a two-byte character. */
+  unsigned int ch;
+
+  /* Additional information used by the ISO2022 encoder. */
+  struct
+    {
+      /* CHARSET holds the character sets currently assigned to the G0
+        through G3 registers.  It is initialized from the array
+        INITIAL_CHARSET in CODESYS. */
+      Lisp_Object charset[4];
+
+      /* Which registers are currently invoked into the left (GL) and
+        right (GR) halves of the 8-bit encoding space? */
+      int register_left, register_right;
+
+      /* Whether we need to explicitly designate the charset in the
+        G? register before using it.  It is initialized from the
+        array FORCE_CHARSET_ON_OUTPUT in CODESYS. */
+      unsigned char force_charset_on_output[4];
+
+      /* Other state variables that need to be preserved across
+        invocations. */
+      Lisp_Object current_charset;
+      int current_half;
+      int current_char_boundary;
+    } iso2022;
+
+  /* Additional information (the state of the running CCL program)
+     used by the CCL encoder. */
+  struct ccl_program ccl;
+};
+
+static int encoding_reader (Lstream *stream, unsigned char *data, size_t size);
+static int encoding_writer (Lstream *stream, CONST unsigned char *data,
+                           size_t size);
+static int encoding_rewinder   (Lstream *stream);
+static int encoding_seekable_p (Lstream *stream);
+static int encoding_flusher    (Lstream *stream);
+static int encoding_closer     (Lstream *stream);
+static Lisp_Object encoding_marker (Lisp_Object stream,
+                                   void (*markobj) (Lisp_Object));
+
+DEFINE_LSTREAM_IMPLEMENTATION ("encoding", lstream_encoding,
+                              sizeof (struct encoding_stream));
+
+static Lisp_Object
+encoding_marker (Lisp_Object stream, void (*markobj) (Lisp_Object))
+{
+  Lstream *str = ENCODING_STREAM_DATA (XLSTREAM (stream))->other_end;
+  Lisp_Object str_obj;
+
+  /* We do not need to mark the coding systems or charsets stored
+     within the stream because they are stored in a global list
+     and automatically marked. */
+
+  XSETLSTREAM (str_obj, str);
+  (markobj) (str_obj);
+  if (str->imp->marker)
+    return (str->imp->marker) (str_obj, markobj);
+  else
+    return Qnil;
+}
+
+/* Read SIZE bytes of data and store it into DATA.  We are a encoding stream
+   so we read data from the other end, encode it, and store it into DATA. */
+
+static int
+encoding_reader (Lstream *stream, unsigned char *data, size_t size)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  unsigned char *orig_data = data;
+  int read_size;
+  int error_occurred = 0;
+
+  /* We need to interface to mule_encode(), which expects to take some
+     amount of data and store the result into a Dynarr.  We have
+     mule_encode() store into str->runoff, and take data from there
+     as necessary. */
+
+  /* We loop until we have enough data, reading chunks from the other
+     end and encoding it. */
+  while (1)
+    {
+      /* Take data from the runoff if we can.  Make sure to take at
+        most SIZE bytes, and delete the data from the runoff. */
+      if (Dynarr_length (str->runoff) > 0)
+       {
+         int chunk = min ((int) size, Dynarr_length (str->runoff));
+         memcpy (data, Dynarr_atp (str->runoff, 0), chunk);
+         Dynarr_delete_many (str->runoff, 0, chunk);
+         data += chunk;
+         size -= chunk;
+       }
+
+      if (size == 0)
+       break; /* No more room for data */
+
+      if (str->flags & CODING_STATE_END)
+       /* This means that on the previous iteration, we hit the EOF on
+          the other end.  We loop once more so that mule_encode() can
+          output any final stuff it may be holding, or any "go back
+          to a sane state" escape sequences. (This latter makes sense
+          during encoding.) */
+       break;
+
+      /* Exhausted the runoff, so get some more.  DATA at least SIZE bytes
+        left of storage in it, so it's OK to read directly into it.
+        (We'll be overwriting above, after we've encoded it into the
+        runoff.) */
+      read_size = Lstream_read (str->other_end, data, size);
+      if (read_size < 0)
+       {
+         error_occurred = 1;
+         break;
+       }
+      if (read_size == 0)
+       /* There might be some more end data produced in the translation.
+          See the comment above. */
+       str->flags |= CODING_STATE_END;
+      mule_encode (stream, data, str->runoff, read_size);
+    }
+
+  if (data == orig_data)
+    return error_occurred ? -1 : 0;
+  else
+    return data - orig_data;
+}
+
+static int
+encoding_writer (Lstream *stream, CONST unsigned char *data, size_t size)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  int retval;
+
+  /* Encode all our data into the runoff, and then attempt to write
+     it all out to the other end.  Remove whatever chunk we succeeded
+     in writing. */
+  mule_encode (stream, data, str->runoff, size);
+  retval = Lstream_write (str->other_end, Dynarr_atp (str->runoff, 0),
+                         Dynarr_length (str->runoff));
+  if (retval > 0)
+    Dynarr_delete_many (str->runoff, 0, retval);
+  /* Do NOT return retval.  The return value indicates how much
+     of the incoming data was written, not how many bytes were
+     written. */
+  return size;
+}
+
+static void
+reset_encoding_stream (struct encoding_stream *str)
+{
+  switch (CODING_SYSTEM_TYPE (str->codesys))
+    {
+    case CODESYS_ISO2022:
+      {
+       int i;
+
+       for (i = 0; i < 4; i++)
+         {
+           str->iso2022.charset[i] =
+             CODING_SYSTEM_ISO2022_INITIAL_CHARSET (str->codesys, i);
+           str->iso2022.force_charset_on_output[i] =
+             CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (str->codesys, i);
+         }
+       str->iso2022.register_left = 0;
+       str->iso2022.register_right = 1;
+       str->iso2022.current_charset = Qnil;
+       str->iso2022.current_half = 0;
+       str->iso2022.current_char_boundary = 1;
+       break;
+      }
+    case CODESYS_CCL:
+      setup_ccl_program (&str->ccl, CODING_SYSTEM_CCL_ENCODE (str->codesys));
+      break;
+    default:
+      break;
+    }
+
+  str->flags = str->ch = 0;
+}
+
+static int
+encoding_rewinder (Lstream *stream)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  reset_encoding_stream (str);
+  Dynarr_reset (str->runoff);
+  return Lstream_rewind (str->other_end);
+}
+
+static int
+encoding_seekable_p (Lstream *stream)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  return Lstream_seekable_p (str->other_end);
+}
+
+static int
+encoding_flusher (Lstream *stream)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  return Lstream_flush (str->other_end);
+}
+
+static int
+encoding_closer (Lstream *stream)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+  if (stream->flags & LSTREAM_FL_WRITE)
+    {
+      str->flags |= CODING_STATE_END;
+      encoding_writer (stream, 0, 0);
+    }
+  Dynarr_free (str->runoff);
+  return Lstream_close (str->other_end);
+}
+
+Lisp_Object
+encoding_stream_coding_system (Lstream *stream)
+{
+  Lisp_Object coding_system;
+  struct encoding_stream *str = ENCODING_STREAM_DATA (stream);
+
+  XSETCODING_SYSTEM (coding_system, str->codesys);
+  return coding_system;
+}
+
+void
+set_encoding_stream_coding_system (Lstream *lstr, Lisp_Object codesys)
+{
+  struct Lisp_Coding_System *cs = XCODING_SYSTEM (codesys);
+  struct encoding_stream *str = ENCODING_STREAM_DATA (lstr);
+  str->codesys = cs;
+  reset_encoding_stream (str);
+}
+
+static Lisp_Object
+make_encoding_stream_1 (Lstream *stream, Lisp_Object codesys,
+                       CONST char *mode)
+{
+  Lstream *lstr = Lstream_new (lstream_encoding, mode);
+  struct encoding_stream *str = ENCODING_STREAM_DATA (lstr);
+  Lisp_Object obj;
+
+  xzero (*str);
+  str->runoff = Dynarr_new (unsigned_char);
+  str->other_end = stream;
+  set_encoding_stream_coding_system (lstr, codesys);
+  XSETLSTREAM (obj, lstr);
+  return obj;
+}
+
+Lisp_Object
+make_encoding_input_stream (Lstream *stream, Lisp_Object codesys)
+{
+  return make_encoding_stream_1 (stream, codesys, "r");
+}
+
+Lisp_Object
+make_encoding_output_stream (Lstream *stream, Lisp_Object codesys)
+{
+  return make_encoding_stream_1 (stream, codesys, "w");
+}
+
+/* Convert N bytes of internally-formatted data stored in SRC to an
+   external format, according to the encoding stream ENCODING.
+   Store the encoded data into DST. */
+
+static void
+mule_encode (Lstream *encoding, CONST unsigned char *src,
+            unsigned_char_dynarr *dst, unsigned int n)
+{
+  struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+
+  switch (CODING_SYSTEM_TYPE (str->codesys))
+    {
+#ifdef DEBUG_XEMACS
+    case CODESYS_INTERNAL:
+      Dynarr_add_many (dst, src, n);
+      break;
+#endif
+    case CODESYS_AUTODETECT:
+      /* If we got this far and still haven't decided on the coding
+        system, then do no conversion. */
+    case CODESYS_NO_CONVERSION:
+      encode_coding_no_conversion (encoding, src, dst, n);
+      break;
+    case CODESYS_SHIFT_JIS:
+      encode_coding_sjis (encoding, src, dst, n);
+      break;
+    case CODESYS_BIG5:
+      encode_coding_big5 (encoding, src, dst, n);
+      break;
+    case CODESYS_CCL:
+      ccl_driver (&str->ccl, src, dst, n, 0);
+      break;
+    case CODESYS_ISO2022:
+      encode_coding_iso2022 (encoding, src, dst, n);
+      break;
+    default:
+      abort ();
+    }
+}
+
+DEFUN ("encode-coding-region", Fencode_coding_region, 3, 4, 0, /*
+Encode the text between START and END using CODING-SYSTEM.
+This will, for example, convert Japanese characters into stuff such as
+"^[$B!<!+^[(B" if you use the JIS encoding.  Return length of encoded
+text.  BUFFER defaults to the current buffer if unspecified.
+*/
+       (start, end, coding_system, buffer))
+{
+  Bufpos b, e;
+  struct buffer *buf = decode_buffer (buffer, 0);
+  Lisp_Object instream, lb_outstream, de_outstream, outstream;
+  Lstream *istr, *ostr;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+  get_buffer_range_char (buf, start, end, &b, &e, 0);
+
+  barf_if_buffer_read_only (buf, b, e);
+
+  coding_system = Fget_coding_system (coding_system);
+  instream  = make_lisp_buffer_input_stream  (buf, b, e, 0);
+  lb_outstream = make_lisp_buffer_output_stream (buf, b, 0);
+  de_outstream = make_decoding_output_stream (XLSTREAM (lb_outstream),
+                                             Fget_coding_system (Qbinary));
+  outstream = make_encoding_output_stream (XLSTREAM (de_outstream),
+                                          coding_system);
+  istr = XLSTREAM (instream);
+  ostr = XLSTREAM (outstream);
+  GCPRO4 (instream, outstream, de_outstream, lb_outstream);
+  /* The chain of streams looks like this:
+
+     [BUFFER] <----- send through
+                     ------> [ENCODE AS SPECIFIED]
+                            ------> [DECODE AS BINARY]
+                                    ------> [BUFFER]
+   */
+  while (1)
+    {
+      char tempbuf[1024]; /* some random amount */
+      Bufpos newpos, even_newer_pos;
+      Bufpos oldpos = lisp_buffer_stream_startpos (istr);
+      int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+
+      if (!size_in_bytes)
+       break;
+      newpos = lisp_buffer_stream_startpos (istr);
+      Lstream_write (ostr, tempbuf, size_in_bytes);
+      even_newer_pos = lisp_buffer_stream_startpos (istr);
+      buffer_delete_range (buf, even_newer_pos - (newpos - oldpos),
+                          even_newer_pos, 0);
+    }
+
+  {
+    Charcount retlen =
+      lisp_buffer_stream_startpos (XLSTREAM (instream)) - b;
+    Lstream_close (istr);
+    Lstream_close (ostr);
+    UNGCPRO;
+    Lstream_delete (istr);
+    Lstream_delete (ostr);
+    Lstream_delete (XLSTREAM (de_outstream));
+    Lstream_delete (XLSTREAM (lb_outstream));
+    return make_int (retlen);
+  }
+}
+
+\f
+/************************************************************************/
+/*                          Shift-JIS methods                           */
+/************************************************************************/
+
+/* Shift-JIS is a coding system encoding three character sets: ASCII, right
+   half of JISX0201-Kana, and JISX0208.  An ASCII character is encoded
+   as is.  A character of JISX0201-Kana (TYPE94 character set) is
+   encoded by "position-code + 0x80".  A character of JISX0208
+   (TYPE94x94 character set) is encoded in 2-byte but two
+   position-codes are divided and shifted so that it fit in the range
+   below.
+
+   --- CODE RANGE of Shift-JIS ---
+   (character set)     (range)
+   ASCII               0x00 .. 0x7F
+   JISX0201-Kana       0xA0 .. 0xDF
+   JISX0208 (1st byte) 0x80 .. 0x9F and 0xE0 .. 0xEF
+           (2nd byte)  0x40 .. 0x7E and 0x80 .. 0xFC
+   -------------------------------
+
+*/
+
+/* Is this the first byte of a Shift-JIS two-byte char? */
+
+#define BYTE_SJIS_TWO_BYTE_1_P(c) \
+  (((c) >= 0x81 && (c) <= 0x9F) || ((c) >= 0xE0 && (c) <= 0xEF))
+
+/* Is this the second byte of a Shift-JIS two-byte char? */
+
+#define BYTE_SJIS_TWO_BYTE_2_P(c) \
+  (((c) >= 0x40 && (c) <= 0x7E) || ((c) >= 0x80 && (c) <= 0xFC))
+
+#define BYTE_SJIS_KATAKANA_P(c)        \
+  ((c) >= 0xA1 && (c) <= 0xDF)
+
+static int
+detect_coding_sjis (struct detection_state *st, CONST unsigned char *src,
+                   unsigned int n)
+{
+  int c;
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO)
+       return 0;
+      if (st->shift_jis.in_second_byte)
+       {
+         st->shift_jis.in_second_byte = 0;
+         if (c < 0x40)
+           return 0;
+       }
+      else if ((c >= 0x80 && c < 0xA0) || c >= 0xE0)
+       st->shift_jis.in_second_byte = 1;
+    }
+  return CODING_CATEGORY_SHIFT_JIS_MASK;
+}
+
+/* Convert Shift-JIS data to internal format. */
+
+static void
+decode_coding_sjis (Lstream *decoding, CONST unsigned char *src,
+                   unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+  struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = str->eol_type;
+
+  while (n--)
+    {
+      c = *src++;
+
+      if (ch)
+       {
+         /* Previous character was first byte of Shift-JIS Kanji char. */
+         if (BYTE_SJIS_TWO_BYTE_2_P (c))
+           {
+             unsigned char e1, e2;
+
+             Dynarr_add (dst, LEADING_BYTE_JAPANESE_JISX0208);
+             DECODE_SJIS (ch, c, e1, e2);
+             Dynarr_add (dst, e1);
+             Dynarr_add (dst, e2);
+           }
+         else
+           {
+             DECODE_ADD_BINARY_CHAR (ch, dst);
+             DECODE_ADD_BINARY_CHAR (c, dst);
+           }
+         ch = 0;
+       }
+      else
+       {
+         DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+         if (BYTE_SJIS_TWO_BYTE_1_P (c))
+           ch = c;
+         else if (BYTE_SJIS_KATAKANA_P (c))
+           {
+             Dynarr_add (dst, LEADING_BYTE_KATAKANA_JISX0201);
+             Dynarr_add (dst, c);
+           }
+         else
+           DECODE_ADD_BINARY_CHAR (c, dst);
+       }
+    label_continue_loop:;
+    }
+
+  DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+/* Convert internally-formatted data to Shift-JIS. */
+
+static void
+encode_coding_sjis (Lstream *encoding, CONST unsigned char *src,
+                   unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == '\n')
+       {
+         if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+           Dynarr_add (dst, '\r');
+         if (eol_type != EOL_CR)
+           Dynarr_add (dst, '\n');
+         ch = 0;
+       }
+      else if (BYTE_ASCII_P (c))
+       {
+         Dynarr_add (dst, c);
+         ch = 0;
+       }
+      else if (BUFBYTE_LEADING_BYTE_P (c))
+       ch = (c == LEADING_BYTE_KATAKANA_JISX0201 ||
+             c == LEADING_BYTE_JAPANESE_JISX0208_1978 ||
+             c == LEADING_BYTE_JAPANESE_JISX0208) ? c : 0;
+      else if (ch)
+       {
+         if (ch == LEADING_BYTE_KATAKANA_JISX0201)
+           {
+             Dynarr_add (dst, c);
+             ch = 0;
+           }
+         else if (ch == LEADING_BYTE_JAPANESE_JISX0208_1978 ||
+                  ch == LEADING_BYTE_JAPANESE_JISX0208)
+           ch = c;
+         else
+           {
+             unsigned char j1, j2;
+             ENCODE_SJIS (ch, c, j1, j2);
+             Dynarr_add (dst, j1);
+             Dynarr_add (dst, j2);
+             ch = 0;
+           }
+       }
+    }
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+DEFUN ("decode-shift-jis-char", Fdecode_shift_jis_char, 1, 1, 0, /*
+Decode a JISX0208 character of Shift-JIS coding-system.
+CODE is the character code in Shift-JIS as a cons of type bytes.
+Return the corresponding character.
+*/
+       (code))
+{
+  unsigned char c1, c2, s1, s2;
+
+  CHECK_CONS (code);
+  CHECK_INT (XCAR (code));
+  CHECK_INT (XCDR (code));
+  s1 = XINT (XCAR (code));
+  s2 = XINT (XCDR (code));
+  if (BYTE_SJIS_TWO_BYTE_1_P (s1) &&
+      BYTE_SJIS_TWO_BYTE_2_P (s2))
+    {
+      DECODE_SJIS (s1, s2, c1, c2);
+      return make_char (MAKE_CHAR (Vcharset_japanese_jisx0208,
+                                  c1 & 0x7F, c2 & 0x7F));
+    }
+  else
+    return Qnil;
+}
+
+DEFUN ("encode-shift-jis-char", Fencode_shift_jis_char, 1, 1, 0, /*
+Encode a JISX0208 character CHAR to SHIFT-JIS coding-system.
+Return the corresponding character code in SHIFT-JIS as a cons of two bytes.
+*/
+       (ch))
+{
+  Lisp_Object charset;
+  int c1, c2, s1, s2;
+
+  CHECK_CHAR_COERCE_INT (ch);
+  BREAKUP_CHAR (XCHAR (ch), charset, c1, c2);
+  if (EQ (charset, Vcharset_japanese_jisx0208))
+    {
+      ENCODE_SJIS (c1 | 0x80, c2 | 0x80, s1, s2);
+      return Fcons (make_int (s1), make_int (s2));
+    }
+  else
+    return Qnil;
+}
+
+\f
+/************************************************************************/
+/*                            Big5 methods                              */
+/************************************************************************/
+
+/* BIG5 is a coding system encoding two character sets: ASCII and
+   Big5.  An ASCII character is encoded as is.  Big5 is a two-byte
+   character set and is encoded in two-byte.
+
+   --- CODE RANGE of BIG5 ---
+   (character set)     (range)
+   ASCII               0x00 .. 0x7F
+   Big5 (1st byte)     0xA1 .. 0xFE
+       (2nd byte)      0x40 .. 0x7E and 0xA1 .. 0xFE
+   --------------------------
+
+   Since the number of characters in Big5 is larger than maximum
+   characters in Emacs' charset (96x96), it can't be handled as one
+   charset.  So, in Emacs, Big5 is devided into two: `charset-big5-1'
+   and `charset-big5-2'.  Both <type>s are TYPE94x94.  The former
+   contains frequently used characters and the latter contains less
+   frequently used characters.  */
+
+#define BYTE_BIG5_TWO_BYTE_1_P(c) \
+  ((c) >= 0xA1 && (c) <= 0xFE)
+
+/* Is this the second byte of a Shift-JIS two-byte char? */
+
+#define BYTE_BIG5_TWO_BYTE_2_P(c) \
+  (((c) >= 0x40 && (c) <= 0x7E) || ((c) >= 0xA1 && (c) <= 0xFE))
+
+/* Number of Big5 characters which have the same code in 1st byte.  */
+
+#define BIG5_SAME_ROW (0xFF - 0xA1 + 0x7F - 0x40)
+
+/* Code conversion macros.  These are macros because they are used in
+   inner loops during code conversion.
+
+   Note that temporary variables in macros introduce the classic
+   dynamic-scoping problems with variable names.  We use capital-
+   lettered variables in the assumption that XEmacs does not use
+   capital letters in variables except in a very formalized way
+   (e.g. Qstring). */
+
+/* Convert Big5 code (b1, b2) into its internal string representation
+   (lb, c1, c2). */
+
+/* There is a much simpler way to split the Big5 charset into two.
+   For the moment I'm going to leave the algorithm as-is because it
+   claims to separate out the most-used characters into a single
+   charset, which perhaps will lead to optimizations in various
+   places.
+
+   The way the algorithm works is something like this:
+
+   Big5 can be viewed as a 94x157 charset, where the row is
+   encoded into the bytes 0xA1 .. 0xFE and the column is encoded
+   into the bytes 0x40 .. 0x7E and 0xA1 .. 0xFE.  As for frequency,
+   the split between low and high column numbers is apparently
+   meaningless; ascending rows produce less and less frequent chars.
+   Therefore, we assign the lower half of rows (0xA1 .. 0xC8) to
+   the first charset, and the upper half (0xC9 .. 0xFE) to the
+   second.  To do the conversion, we convert the character into
+   a single number where 0 .. 156 is the first row, 157 .. 313
+   is the second, etc.  That way, the characters are ordered by
+   decreasing frequency.  Then we just chop the space in two
+   and coerce the result into a 94x94 space.
+   */
+
+#define DECODE_BIG5(b1, b2, lb, c1, c2) do                             \
+{                                                                      \
+  int B1 = b1, B2 = b2;                                                        \
+  unsigned int I                                                       \
+    = (B1 - 0xA1) * BIG5_SAME_ROW + B2 - (B2 < 0x7F ? 0x40 : 0x62);    \
+                                                                       \
+  if (B1 < 0xC9)                                                       \
+    {                                                                  \
+      lb = LEADING_BYTE_CHINESE_BIG5_1;                                        \
+    }                                                                  \
+  else                                                                 \
+    {                                                                  \
+      lb = LEADING_BYTE_CHINESE_BIG5_2;                                        \
+      I -= (BIG5_SAME_ROW) * (0xC9 - 0xA1);                            \
+    }                                                                  \
+  c1 = I / (0xFF - 0xA1) + 0xA1;                                       \
+  c2 = I % (0xFF - 0xA1) + 0xA1;                                       \
+} while (0)
+
+/* Convert the internal string representation of a Big5 character
+   (lb, c1, c2) into Big5 code (b1, b2). */
+
+#define ENCODE_BIG5(lb, c1, c2, b1, b2) do                             \
+{                                                                      \
+  unsigned int I = ((c1) - 0xA1) * (0xFF - 0xA1) + ((c2) - 0xA1);      \
+                                                                       \
+  if (lb == LEADING_BYTE_CHINESE_BIG5_2)                               \
+    {                                                                  \
+      I += BIG5_SAME_ROW * (0xC9 - 0xA1);                              \
+    }                                                                  \
+  b1 = I / BIG5_SAME_ROW + 0xA1;                                       \
+  b2 = I % BIG5_SAME_ROW;                                              \
+  b2 += b2 < 0x3F ? 0x40 : 0x62;                                       \
+} while (0)
+
+static int
+detect_coding_big5 (struct detection_state *st, CONST unsigned char *src,
+                   unsigned int n)
+{
+  int c;
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == ISO_CODE_ESC || c == ISO_CODE_SI || c == ISO_CODE_SO ||
+         (c >= 0x80 && c <= 0xA0))
+       return 0;
+      if (st->big5.in_second_byte)
+       {
+         st->big5.in_second_byte = 0;
+         if (c < 0x40 || (c >= 0x80 && c <= 0xA0))
+           return 0;
+       }
+      else if (c >= 0xA1)
+       st->big5.in_second_byte = 1;
+    }
+  return CODING_CATEGORY_BIG5_MASK;
+}
+
+/* Convert Big5 data to internal format. */
+
+static void
+decode_coding_big5 (Lstream *decoding, CONST unsigned char *src,
+                   unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+  struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = str->eol_type;
+
+  while (n--)
+    {
+      c = *src++;
+      if (ch)
+       {
+         /* Previous character was first byte of Big5 char. */
+         if (BYTE_BIG5_TWO_BYTE_2_P (c))
+           {
+             unsigned char b1, b2, b3;
+             DECODE_BIG5 (ch, c, b1, b2, b3);
+             Dynarr_add (dst, b1);
+             Dynarr_add (dst, b2);
+             Dynarr_add (dst, b3);
+           }
+         else
+           {
+             DECODE_ADD_BINARY_CHAR (ch, dst);
+             DECODE_ADD_BINARY_CHAR (c, dst);
+           }
+         ch = 0;
+       }
+      else
+       {
+         DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+         if (BYTE_BIG5_TWO_BYTE_1_P (c))
+           ch = c;
+         else
+           DECODE_ADD_BINARY_CHAR (c, dst);
+       }
+    label_continue_loop:;
+    }
+
+  DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+/* Convert internally-formatted data to Big5. */
+
+static void
+encode_coding_big5 (Lstream *encoding, CONST unsigned char *src,
+                   unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == '\n')
+       {
+         if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+           Dynarr_add (dst, '\r');
+         if (eol_type != EOL_CR)
+           Dynarr_add (dst, '\n');
+       }
+      else if (BYTE_ASCII_P (c))
+       {
+         /* ASCII. */
+         Dynarr_add (dst, c);
+       }
+      else if (BUFBYTE_LEADING_BYTE_P (c))
+       {
+         if (c == LEADING_BYTE_CHINESE_BIG5_1 ||
+             c == LEADING_BYTE_CHINESE_BIG5_2)
+           {
+             /* A recognized leading byte. */
+             ch = c;
+             continue; /* not done with this character. */
+           }
+         /* otherwise just ignore this character. */
+       }
+      else if (ch == LEADING_BYTE_CHINESE_BIG5_1 ||
+              ch == LEADING_BYTE_CHINESE_BIG5_2)
+       {
+         /* Previous char was a recognized leading byte. */
+         ch = (ch << 8) | c;
+         continue; /* not done with this character. */
+       }
+      else if (ch)
+       {
+         /* Encountering second byte of a Big5 character. */
+         unsigned char b1, b2;
+
+         ENCODE_BIG5 (ch >> 8, ch & 0xFF, c, b1, b2);
+         Dynarr_add (dst, b1);
+         Dynarr_add (dst, b2);
+       }
+
+      ch = 0;
+    }
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+
+DEFUN ("decode-big5-char", Fdecode_big5_char, 1, 1, 0, /*
+Decode a Big5 character CODE of BIG5 coding-system.
+CODE is the character code in BIG5, a cons of two integers.
+Return the corresponding character.
+*/
+       (code))
+{
+  unsigned char c1, c2, b1, b2;
+
+  CHECK_CONS (code);
+  CHECK_INT (XCAR (code));
+  CHECK_INT (XCDR (code));
+  b1 = XINT (XCAR (code));
+  b2 = XINT (XCDR (code));
+  if (BYTE_BIG5_TWO_BYTE_1_P (b1) &&
+      BYTE_BIG5_TWO_BYTE_2_P (b2))
+    {
+      int leading_byte;
+      Lisp_Object charset;
+      DECODE_BIG5 (b1, b2, leading_byte, c1, c2);
+      charset = CHARSET_BY_LEADING_BYTE (leading_byte);
+      return make_char (MAKE_CHAR (charset, c1 & 0x7F, c2 & 0x7F));
+    }
+  else
+    return Qnil;
+}
+
+DEFUN ("encode-big5-char", Fencode_big5_char, 1, 1, 0, /*
+Encode the Big5 character CH to BIG5 coding-system.
+Return the corresponding character code in Big5.
+*/
+       (ch))
+{
+  Lisp_Object charset;
+  int c1, c2, b1, b2;
+
+  CHECK_CHAR_COERCE_INT (ch);
+  BREAKUP_CHAR (XCHAR (ch), charset, c1, c2);
+  if (EQ (charset, Vcharset_chinese_big5_1) ||
+      EQ (charset, Vcharset_chinese_big5_2))
+    {
+      ENCODE_BIG5 (XCHARSET_LEADING_BYTE (charset), c1 | 0x80, c2 | 0x80,
+                  b1, b2);
+      return Fcons (make_int (b1), make_int (b2));
+    }
+  else
+    return Qnil;
+}
+
+\f
+/************************************************************************/
+/*                           ISO2022 methods                            */
+/************************************************************************/
+
+/* The following note describes the coding system ISO2022 briefly.
+   Since the intention of this note is to help understanding of the
+   programs in this file, some parts are NOT ACCURATE or OVERLY
+   SIMPLIFIED.  For thorough understanding, please refer to the
+   original document of ISO2022.
+
+   ISO2022 provides many mechanisms to encode several character sets
+   in 7-bit and 8-bit environments.  If one chooses 7-bit environment,
+   all text is encoded by codes of less than 128.  This may make the
+   encoded text a little bit longer, but the text get more stability
+   to pass through several gateways (some of them strip off MSB).
+
+   There are two kind of character sets: control character set and
+   graphic character set.  The former contains control characters such
+   as `newline' and `escape' to provide control functions (control
+   functions are provided also by escape sequence).  The latter
+   contains graphic characters such as 'A' and '-'.  Emacs recognizes
+   two control character sets and many graphic character sets.
+
+   Graphic character sets are classified into one of four types,
+   according to the dimension and number of characters in the set:
+   TYPE94, TYPE96, TYPE94x94, and TYPE96x96.  In addition, each
+   character set is assigned an identification byte, unique for each
+   type, called "final character" (denoted as <F> hereafter).  The <F>
+   of each character set is decided by ECMA(*) when it is registered
+   in ISO.  Code range of <F> is 0x30..0x7F (0x30..0x3F are for
+   private use only).
+
+   Note (*): ECMA = European Computer Manufacturers Association
+
+   Here are examples of graphic character set [NAME(<F>)]:
+       o TYPE94 -- ASCII('B'), right-half-of-JISX0201('I'), ...
+       o TYPE96 -- right-half-of-ISO8859-1('A'), ...
+       o TYPE94x94 -- GB2312('A'), JISX0208('B'), ...
+       o TYPE96x96 -- none for the moment
+
+   A code area (1byte=8bits) is divided into 4 areas, C0, GL, C1, and GR.
+       C0 [0x00..0x1F] -- control character plane 0
+       GL [0x20..0x7F] -- graphic character plane 0
+       C1 [0x80..0x9F] -- control character plane 1
+       GR [0xA0..0xFF] -- graphic character plane 1
+
+   A control character set is directly designated and invoked to C0 or
+   C1 by an escape sequence.  The most common case is that:
+   - ISO646's  control character set is designated/invoked to C0, and
+   - ISO6429's control character set is designated/invoked to C1,
+   and usually these designations/invocations are omitted in encoded
+   text.  In a 7-bit environment, only C0 can be used, and a control
+   character for C1 is encoded by an appropriate escape sequence to
+   fit into the environment.  All control characters for C1 are
+   defined to have corresponding escape sequences.
+
+   A graphic character set is at first designated to one of four
+   graphic registers (G0 through G3), then these graphic registers are
+   invoked to GL or GR.  These designations and invocations can be
+   done independently.  The most common case is that G0 is invoked to
+   GL, G1 is invoked to GR, and ASCII is designated to G0.  Usually
+   these invocations and designations are omitted in encoded text.
+   In a 7-bit environment, only GL can be used.
+
+   When a graphic character set of TYPE94 or TYPE94x94 is invoked to
+   GL, codes 0x20 and 0x7F of the GL area work as control characters
+   SPACE and DEL respectively, and code 0xA0 and 0xFF of GR area
+   should not be used.
+
+   There are two ways of invocation: locking-shift and single-shift.
+   With locking-shift, the invocation lasts until the next different
+   invocation, whereas with single-shift, the invocation works only
+   for the following character and doesn't affect locking-shift.
+   Invocations are done by the following control characters or escape
+   sequences.
+
+   ----------------------------------------------------------------------
+   abbrev  function                 cntrl escape seq   description
+   ----------------------------------------------------------------------
+   SI/LS0  (shift-in)               0x0F  none         invoke G0 into GL
+   SO/LS1  (shift-out)              0x0E  none         invoke G1 into GL
+   LS1R    (locking-shift-1 right)   none  ESC '~'      invoke G1 into GR
+   LS2     (locking-shift-2)        none  ESC 'n'      invoke G2 into GL
+   LS2R    (locking-shift-2 right)   none  ESC '}'      invoke G2 into GR
+   LS3     (locking-shift-3)        none  ESC 'o'      invoke G3 into GL
+   LS3R    (locking-shift 3 right)   none  ESC '|'      invoke G3 into GR
+   SS2     (single-shift-2)         0x8E  ESC 'N'      invoke G2 for one char
+   SS3     (single-shift-3)         0x8F  ESC 'O'      invoke G3 for one char
+   ----------------------------------------------------------------------
+   The first four are for locking-shift.  Control characters for these
+   functions are defined by macros ISO_CODE_XXX in `coding.h'.
+
+   Designations are done by the following escape sequences.
+   ----------------------------------------------------------------------
+   escape sequence     description
+   ----------------------------------------------------------------------
+   ESC '(' <F>         designate TYPE94<F> to G0
+   ESC ')' <F>         designate TYPE94<F> to G1
+   ESC '*' <F>         designate TYPE94<F> to G2
+   ESC '+' <F>         designate TYPE94<F> to G3
+   ESC ',' <F>         designate TYPE96<F> to G0 (*)
+   ESC '-' <F>         designate TYPE96<F> to G1
+   ESC '.' <F>         designate TYPE96<F> to G2
+   ESC '/' <F>         designate TYPE96<F> to G3
+   ESC '$' '(' <F>     designate TYPE94x94<F> to G0 (**)
+   ESC '$' ')' <F>     designate TYPE94x94<F> to G1
+   ESC '$' '*' <F>     designate TYPE94x94<F> to G2
+   ESC '$' '+' <F>     designate TYPE94x94<F> to G3
+   ESC '$' ',' <F>     designate TYPE96x96<F> to G0 (*)
+   ESC '$' '-' <F>     designate TYPE96x96<F> to G1
+   ESC '$' '.' <F>     designate TYPE96x96<F> to G2
+   ESC '$' '/' <F>     designate TYPE96x96<F> to G3
+   ----------------------------------------------------------------------
+   In this list, "TYPE94<F>" means a graphic character set of type TYPE94
+   and final character <F>, and etc.
+
+   Note (*): Although these designations are not allowed in ISO2022,
+   Emacs accepts them on decoding, and produces them on encoding
+   TYPE96 or TYPE96x96 character set in a coding system which is
+   characterized as 7-bit environment, non-locking-shift, and
+   non-single-shift.
+
+   Note (**): If <F> is '@', 'A', or 'B', the intermediate character
+   '(' can be omitted.  We call this as "short-form" here after.
+
+   Now you may notice that there are a lot of ways for encoding the
+   same multilingual text in ISO2022.  Actually, there exist many
+   coding systems such as Compound Text (used in X's inter client
+   communication, ISO-2022-JP (used in Japanese internet), ISO-2022-KR
+   (used in Korean internet), EUC (Extended UNIX Code, used in Asian
+   localized platforms), and all of these are variants of ISO2022.
+
+   In addition to the above, Emacs handles two more kinds of escape
+   sequences: ISO6429's direction specification and Emacs' private
+   sequence for specifying character composition.
+
+   ISO6429's direction specification takes the following format:
+       o CSI ']'      -- end of the current direction
+       o CSI '0' ']'  -- end of the current direction
+       o CSI '1' ']'  -- start of left-to-right text
+       o CSI '2' ']'  -- start of right-to-left text
+   The control character CSI (0x9B: control sequence introducer) is
+   abbreviated to the escape sequence ESC '[' in 7-bit environment.
+
+   Character composition specification takes the following format:
+       o ESC '0' -- start character composition
+       o ESC '1' -- end character composition
+   Since these are not standard escape sequences of any ISO, the use
+   of them for these meanings is restricted to Emacs only.  */
+
+static void
+reset_iso2022 (Lisp_Object coding_system, struct iso2022_decoder *iso)
+{
+  int i;
+
+  for (i = 0; i < 4; i++)
+    {
+      if (!NILP (coding_system))
+       iso->charset[i] =
+         XCODING_SYSTEM_ISO2022_INITIAL_CHARSET (coding_system, i);
+      else
+       iso->charset[i] = Qt;
+      iso->invalid_designated[i] = 0;
+    }
+  iso->esc = ISO_ESC_NOTHING;
+  iso->esc_bytes_index = 0;
+  iso->register_left = 0;
+  iso->register_right = 1;
+  iso->switched_dir_and_no_valid_charset_yet = 0;
+  iso->invalid_switch_dir = 0;
+  iso->output_direction_sequence = 0;
+  iso->output_literally = 0;
+  if (iso->composite_chars)
+    Dynarr_reset (iso->composite_chars);
+}
+
+static int
+fit_to_be_escape_quoted (unsigned char c)
+{
+  switch (c)
+    {
+    case ISO_CODE_ESC:
+    case ISO_CODE_CSI:
+    case ISO_CODE_SS2:
+    case ISO_CODE_SS3:
+    case ISO_CODE_SO:
+    case ISO_CODE_SI:
+      return 1;
+
+    default:
+      return 0;
+    }
+}
+
+/* Parse one byte of an ISO2022 escape sequence.
+   If the result is an invalid escape sequence, return 0 and
+   do not change anything in STR.  Otherwise, if the result is
+   an incomplete escape sequence, update ISO2022.ESC and
+   ISO2022.ESC_BYTES and return -1.  Otherwise, update
+   all the state variables (but not ISO2022.ESC_BYTES) and
+   return 1.
+
+   If CHECK_INVALID_CHARSETS is non-zero, check for designation
+   or invocation of an invalid character set and treat that as
+   an unrecognized escape sequence. */
+
+static int
+parse_iso2022_esc (Lisp_Object codesys, struct iso2022_decoder *iso,
+                  unsigned char c, unsigned int *flags,
+                  int check_invalid_charsets)
+{
+  /* (1) If we're at the end of a designation sequence, CS is the
+     charset being designated and REG is the register to designate
+     it to.
+
+     (2) If we're at the end of a locking-shift sequence, REG is
+     the register to invoke and HALF (0 == left, 1 == right) is
+     the half to invoke it into.
+
+     (3) If we're at the end of a single-shift sequence, REG is
+     the register to invoke. */
+  Lisp_Object cs = Qnil;
+  int reg, half;
+
+  /* NOTE: This code does goto's all over the fucking place.
+     The reason for this is that we're basically implementing
+     a state machine here, and hierarchical languages like C
+     don't really provide a clean way of doing this. */
+
+  if (! (*flags & CODING_STATE_ESCAPE))
+    /* At beginning of escape sequence; we need to reset our
+       escape-state variables. */
+    iso->esc = ISO_ESC_NOTHING;
+
+  iso->output_literally = 0;
+  iso->output_direction_sequence = 0;
+
+  switch (iso->esc)
+    {
+    case ISO_ESC_NOTHING:
+      iso->esc_bytes_index = 0;
+      switch (c)
+       {
+       case ISO_CODE_ESC:      /* Start escape sequence */
+         *flags |= CODING_STATE_ESCAPE;
+         iso->esc = ISO_ESC;
+         goto not_done;
+
+       case ISO_CODE_CSI:      /* ISO6429 (specifying directionality) */
+         *flags |= CODING_STATE_ESCAPE;
+         iso->esc = ISO_ESC_5_11;
+         goto not_done;
+
+       case ISO_CODE_SO:       /* locking shift 1 */
+         reg = 1; half = 0;
+         goto locking_shift;
+       case ISO_CODE_SI:       /* locking shift 0 */
+         reg = 0; half = 0;
+         goto locking_shift;
+
+       case ISO_CODE_SS2:      /* single shift */
+         reg = 2;
+         goto single_shift;
+       case ISO_CODE_SS3:      /* single shift */
+         reg = 3;
+         goto single_shift;
+
+       default:                        /* Other control characters */
+         return 0;
+       }
+
+    case ISO_ESC:
+      switch (c)
+       {
+         /**** single shift ****/
+
+       case 'N':       /* single shift 2 */
+         reg = 2;
+         goto single_shift;
+       case 'O':       /* single shift 3 */
+         reg = 3;
+         goto single_shift;
+
+         /**** locking shift ****/
+
+       case '~':       /* locking shift 1 right */
+         reg = 1; half = 1;
+         goto locking_shift;
+       case 'n':       /* locking shift 2 */
+         reg = 2; half = 0;
+         goto locking_shift;
+       case '}':       /* locking shift 2 right */
+         reg = 2; half = 1;
+         goto locking_shift;
+       case 'o':       /* locking shift 3 */
+         reg = 3; half = 0;
+         goto locking_shift;
+       case '|':       /* locking shift 3 right */
+         reg = 3; half = 1;
+         goto locking_shift;
+
+         /**** composite ****/
+
+       case '0':
+         iso->esc = ISO_ESC_START_COMPOSITE;
+         *flags = (*flags & CODING_STATE_ISO2022_LOCK) |
+           CODING_STATE_COMPOSITE;
+         return 1;
+
+       case '1':
+         iso->esc = ISO_ESC_END_COMPOSITE;
+         *flags = (*flags & CODING_STATE_ISO2022_LOCK) &
+           ~CODING_STATE_COMPOSITE;
+         return 1;
+
+         /**** directionality ****/
+
+       case '[':
+         iso->esc = ISO_ESC_5_11;
+         goto not_done;
+
+         /**** designation ****/
+
+       case '$':       /* multibyte charset prefix */
+         iso->esc = ISO_ESC_2_4;
+         goto not_done;
+
+       default:
+         if (0x28 <= c && c <= 0x2F)
+           {
+             iso->esc = (enum iso_esc_flag) (c - 0x28 + ISO_ESC_2_8);
+             goto not_done;
+           }
+
+         /* This function is called with CODESYS equal to nil when
+            doing coding-system detection. */
+         if (!NILP (codesys)
+             && XCODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+             && fit_to_be_escape_quoted (c))
+           {
+             iso->esc = ISO_ESC_LITERAL;
+             *flags &= CODING_STATE_ISO2022_LOCK;
+             return 1;
+           }
+
+         /* bzzzt! */
+         return 0;
+       }
+
+
+
+      /**** directionality ****/
+
+    case ISO_ESC_5_11:         /* ISO6429 direction control */
+      if (c == ']')
+       {
+         *flags &= (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+         goto directionality;
+       }
+      if      (c == '0') iso->esc = ISO_ESC_5_11_0;
+      else if (c == '1') iso->esc = ISO_ESC_5_11_1;
+      else if (c == '2') iso->esc = ISO_ESC_5_11_2;
+      else               return 0;
+      goto not_done;
+
+    case ISO_ESC_5_11_0:
+      if (c == ']')
+       {
+         *flags &= (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+         goto directionality;
+       }
+      return 0;
+
+    case ISO_ESC_5_11_1:
+      if (c == ']')
+       {
+         *flags = (CODING_STATE_ISO2022_LOCK & ~CODING_STATE_R2L);
+         goto directionality;
+       }
+      return 0;
+
+    case ISO_ESC_5_11_2:
+      if (c == ']')
+       {
+         *flags = (*flags & CODING_STATE_ISO2022_LOCK) | CODING_STATE_R2L;
+         goto directionality;
+       }
+      return 0;
+
+    directionality:
+      iso->esc = ISO_ESC_DIRECTIONALITY;
+      /* Various junk here to attempt to preserve the direction sequences
+        literally in the text if they would otherwise be swallowed due
+        to invalid designations that don't show up as actual charset
+        changes in the text. */
+      if (iso->invalid_switch_dir)
+       {
+         /* We already inserted a direction switch literally into the
+            text.  We assume (#### this may not be right) that the
+            next direction switch is the one going the other way,
+            and we need to output that literally as well. */
+         iso->output_literally = 1;
+         iso->invalid_switch_dir = 0;
+       }
+      else
+       {
+         int jj;
+
+         /* If we are in the thrall of an invalid designation,
+          then stick the directionality sequence literally into the
+          output stream so it ends up in the original text again. */
+         for (jj = 0; jj < 4; jj++)
+           if (iso->invalid_designated[jj])
+             break;
+         if (jj < 4)
+           {
+             iso->output_literally = 1;
+             iso->invalid_switch_dir = 1;
+           }
+         else
+           /* Indicate that we haven't yet seen a valid designation,
+              so that if a switch-dir is directly followed by an
+              invalid designation, both get inserted literally. */
+           iso->switched_dir_and_no_valid_charset_yet = 1;
+       }
+      return 1;
+
+
+      /**** designation ****/
+
+    case ISO_ESC_2_4:
+      if (0x28 <= c && c <= 0x2F)
+       {
+         iso->esc = (enum iso_esc_flag) (c - 0x28 + ISO_ESC_2_4_8);
+         goto not_done;
+       }
+      if (0x40 <= c && c <= 0x42)
+       {
+         cs = CHARSET_BY_ATTRIBUTES (CHARSET_TYPE_94X94, c,
+                                     *flags & CODING_STATE_R2L ?
+                                     CHARSET_RIGHT_TO_LEFT :
+                                     CHARSET_LEFT_TO_RIGHT);
+         reg = 0;
+         goto designated;
+       }
+      return 0;
+
+    default:
+      {
+       int type =-1;
+
+       if (c < '0' || c > '~')
+         return 0; /* bad final byte */
+
+       if (iso->esc >= ISO_ESC_2_8 &&
+           iso->esc <= ISO_ESC_2_15)
+         {
+           type = ((iso->esc >= ISO_ESC_2_12) ?
+                   CHARSET_TYPE_96 : CHARSET_TYPE_94);
+           reg = (iso->esc - ISO_ESC_2_8) & 3;
+         }
+       else if (iso->esc >= ISO_ESC_2_4_8 &&
+                iso->esc <= ISO_ESC_2_4_15)
+         {
+           type = ((iso->esc >= ISO_ESC_2_4_12) ?
+                   CHARSET_TYPE_96X96 : CHARSET_TYPE_94X94);
+           reg = (iso->esc - ISO_ESC_2_4_8) & 3;
+         }
+       else
+         {
+           /* Can this ever be reached? -slb */
+           abort();
+         }
+
+       cs = CHARSET_BY_ATTRIBUTES (type, c,
+                                   *flags & CODING_STATE_R2L ?
+                                   CHARSET_RIGHT_TO_LEFT :
+                                   CHARSET_LEFT_TO_RIGHT);
+       goto designated;
+      }
+    }
+
+ not_done:
+  iso->esc_bytes[iso->esc_bytes_index++] = (unsigned char) c;
+  return -1;
+
+ single_shift:
+  if (check_invalid_charsets && !CHARSETP (iso->charset[reg]))
+    /* can't invoke something that ain't there. */
+    return 0;
+  iso->esc = ISO_ESC_SINGLE_SHIFT;
+  *flags &= CODING_STATE_ISO2022_LOCK;
+  if (reg == 2)
+    *flags |= CODING_STATE_SS2;
+  else
+    *flags |= CODING_STATE_SS3;
+  return 1;
+
+ locking_shift:
+  if (check_invalid_charsets &&
+      !CHARSETP (iso->charset[reg]))
+    /* can't invoke something that ain't there. */
+    return 0;
+  if (half)
+    iso->register_right = reg;
+  else
+    iso->register_left = reg;
+  *flags &= CODING_STATE_ISO2022_LOCK;
+  iso->esc = ISO_ESC_LOCKING_SHIFT;
+  return 1;
+
+ designated:
+  if (NILP (cs) && check_invalid_charsets)
+    {
+      iso->invalid_designated[reg] = 1;
+      iso->charset[reg] = Vcharset_ascii;
+      iso->esc = ISO_ESC_DESIGNATE;
+      *flags &= CODING_STATE_ISO2022_LOCK;
+      iso->output_literally = 1;
+      if (iso->switched_dir_and_no_valid_charset_yet)
+       {
+         /* We encountered a switch-direction followed by an
+            invalid designation.  Ensure that the switch-direction
+            gets outputted; otherwise it will probably get eaten
+            when the text is written out again. */
+         iso->switched_dir_and_no_valid_charset_yet = 0;
+         iso->output_direction_sequence = 1;
+         /* And make sure that the switch-dir going the other
+            way gets outputted, as well. */
+         iso->invalid_switch_dir = 1;
+       }
+      return 1;
+    }
+  /* This function is called with CODESYS equal to nil when
+     doing coding-system detection. */
+  if (!NILP (codesys))
+    {
+      charset_conversion_spec_dynarr *dyn =
+       XCODING_SYSTEM (codesys)->iso2022.input_conv;
+
+      if (dyn)
+       {
+         int i;
+
+         for (i = 0; i < Dynarr_length (dyn); i++)
+           {
+             struct charset_conversion_spec *spec = Dynarr_atp (dyn, i);
+             if (EQ (cs, spec->from_charset))
+               cs = spec->to_charset;
+           }
+       }
+    }
+
+  iso->charset[reg] = cs;
+  iso->esc = ISO_ESC_DESIGNATE;
+  *flags &= CODING_STATE_ISO2022_LOCK;
+  if (iso->invalid_designated[reg])
+    {
+      iso->invalid_designated[reg] = 0;
+      iso->output_literally = 1;
+    }
+  if (iso->switched_dir_and_no_valid_charset_yet)
+    iso->switched_dir_and_no_valid_charset_yet = 0;
+  return 1;
+}
+
+static int
+detect_coding_iso2022 (struct detection_state *st, CONST unsigned char *src,
+                      unsigned int n)
+{
+  int c;
+  int mask;
+
+  /* #### There are serious deficiencies in the recognition mechanism
+     here.  This needs to be much smarter if it's going to cut it. */
+
+  if (!st->iso2022.initted)
+    {
+      reset_iso2022 (Qnil, &st->iso2022.iso);
+      st->iso2022.mask = (CODING_CATEGORY_ISO_7_MASK |
+                         CODING_CATEGORY_ISO_8_DESIGNATE_MASK |
+                         CODING_CATEGORY_ISO_8_1_MASK |
+                         CODING_CATEGORY_ISO_8_2_MASK |
+                         CODING_CATEGORY_ISO_LOCK_SHIFT_MASK);
+      st->iso2022.flags = 0;
+      st->iso2022.high_byte_count = 0;
+      st->iso2022.saw_single_shift = 0;
+      st->iso2022.initted = 1;
+    }
+
+  mask = st->iso2022.mask;
+
+  while (n--)
+    {
+      c = *src++;
+      if (c >= 0xA0)
+       {
+         mask &= ~CODING_CATEGORY_ISO_7_MASK;
+         st->iso2022.high_byte_count++;
+       }
+      else
+       {
+         if (st->iso2022.high_byte_count && !st->iso2022.saw_single_shift)
+           {
+             if (st->iso2022.high_byte_count & 1)
+               /* odd number of high bytes; assume not iso-8-2 */
+               mask &= ~CODING_CATEGORY_ISO_8_2_MASK;
+           }
+         st->iso2022.high_byte_count = 0;
+         st->iso2022.saw_single_shift = 0;
+         if (c > 0x80)
+           mask &= ~CODING_CATEGORY_ISO_7_MASK;
+       }
+      if (!(st->iso2022.flags & CODING_STATE_ESCAPE)
+         && (BYTE_C0_P (c) || BYTE_C1_P (c)))
+       { /* control chars */
+         switch (c)
+           {
+             /* Allow and ignore control characters that you might
+                reasonably see in a text file */
+           case '\r':
+           case '\n':
+           case '\t':
+           case  7: /* bell */
+           case  8: /* backspace */
+           case 11: /* vertical tab */
+           case 12: /* form feed */
+           case 26: /* MS-DOS C-z junk */
+           case 31: /* '^_' -- for info */
+             goto label_continue_loop;
+
+           default:
+             break;
+           }
+       }
+
+      if ((st->iso2022.flags & CODING_STATE_ESCAPE) || BYTE_C0_P (c)
+          || BYTE_C1_P (c))
+       {
+         if (parse_iso2022_esc (Qnil, &st->iso2022.iso, c,
+                                &st->iso2022.flags, 0))
+           {
+             switch (st->iso2022.iso.esc)
+               {
+               case ISO_ESC_DESIGNATE:
+                 mask &= ~CODING_CATEGORY_ISO_8_1_MASK;
+                 mask &= ~CODING_CATEGORY_ISO_8_2_MASK;
+                 break;
+               case ISO_ESC_LOCKING_SHIFT:
+                 mask = CODING_CATEGORY_ISO_LOCK_SHIFT_MASK;
+                 goto ran_out_of_chars;
+               case ISO_ESC_SINGLE_SHIFT:
+                 mask &= ~CODING_CATEGORY_ISO_8_DESIGNATE_MASK;
+                 st->iso2022.saw_single_shift = 1;
+                 break;
+               default:
+                 break;
+               }
+           }
+         else
+           {
+             mask = 0;
+             goto ran_out_of_chars;
+           }
+       }
+    label_continue_loop:;
+    }
+
+ ran_out_of_chars:
+
+  return mask;
+}
+
+static int
+postprocess_iso2022_mask (int mask)
+{
+  /* #### kind of cheesy */
+  /* If seven-bit ISO is allowed, then assume that the encoding is
+     entirely seven-bit and turn off the eight-bit ones. */
+  if (mask & CODING_CATEGORY_ISO_7_MASK)
+    mask &= ~ (CODING_CATEGORY_ISO_8_DESIGNATE_MASK |
+              CODING_CATEGORY_ISO_8_1_MASK |
+              CODING_CATEGORY_ISO_8_2_MASK);
+  return mask;
+}
+
+/* If FLAGS is a null pointer or specifies right-to-left motion,
+   output a switch-dir-to-left-to-right sequence to DST.
+   Also update FLAGS if it is not a null pointer.
+   If INTERNAL_P is set, we are outputting in internal format and
+   need to handle the CSI differently. */
+
+static void
+restore_left_to_right_direction (struct Lisp_Coding_System *codesys,
+                                unsigned_char_dynarr *dst,
+                                unsigned int *flags,
+                                int internal_p)
+{
+  if (!flags || (*flags & CODING_STATE_R2L))
+    {
+      if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+       {
+         Dynarr_add (dst, ISO_CODE_ESC);
+         Dynarr_add (dst, '[');
+       }
+      else if (internal_p)
+       DECODE_ADD_BINARY_CHAR (ISO_CODE_CSI, dst);
+      else
+       Dynarr_add (dst, ISO_CODE_CSI);
+      Dynarr_add (dst, '0');
+      Dynarr_add (dst, ']');
+      if (flags)
+       *flags &= ~CODING_STATE_R2L;
+    }
+}
+
+/* If FLAGS is a null pointer or specifies a direction different from
+   DIRECTION (which should be either CHARSET_RIGHT_TO_LEFT or
+   CHARSET_LEFT_TO_RIGHT), output the appropriate switch-dir escape
+   sequence to DST.  Also update FLAGS if it is not a null pointer.
+   If INTERNAL_P is set, we are outputting in internal format and
+   need to handle the CSI differently. */
+
+static void
+ensure_correct_direction (int direction, struct Lisp_Coding_System *codesys,
+                         unsigned_char_dynarr *dst, unsigned int *flags,
+                         int internal_p)
+{
+  if ((!flags || (*flags & CODING_STATE_R2L)) &&
+      direction == CHARSET_LEFT_TO_RIGHT)
+    restore_left_to_right_direction (codesys, dst, flags, internal_p);
+  else if (!CODING_SYSTEM_ISO2022_NO_ISO6429 (codesys)
+          && (!flags || !(*flags & CODING_STATE_R2L)) &&
+          direction == CHARSET_RIGHT_TO_LEFT)
+    {
+      if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+       {
+         Dynarr_add (dst, ISO_CODE_ESC);
+         Dynarr_add (dst, '[');
+       }
+      else if (internal_p)
+       DECODE_ADD_BINARY_CHAR (ISO_CODE_CSI, dst);
+      else
+       Dynarr_add (dst, ISO_CODE_CSI);
+      Dynarr_add (dst, '2');
+      Dynarr_add (dst, ']');
+      if (flags)
+       *flags |= CODING_STATE_R2L;
+    }
+}
+
+/* Convert ISO2022-format data to internal format. */
+
+static void
+decode_coding_iso2022 (Lstream *decoding, CONST unsigned char *src,
+                      unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+  struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+  Lisp_Object coding_system;
+  unsigned_char_dynarr *real_dst = dst;
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = str->eol_type;
+  XSETCODING_SYSTEM (coding_system, str->codesys);
+
+  if (flags & CODING_STATE_COMPOSITE)
+    dst = str->iso2022.composite_chars;
+
+  while (n--)
+    {
+      c = *src++;
+      if (flags & CODING_STATE_ESCAPE)
+       {       /* Within ESC sequence */
+         int retval = parse_iso2022_esc (coding_system, &str->iso2022,
+                                         c, &flags, 1);
+
+         if (retval)
+           {
+             switch (str->iso2022.esc)
+               {
+               case ISO_ESC_START_COMPOSITE:
+                 if (str->iso2022.composite_chars)
+                   Dynarr_reset (str->iso2022.composite_chars);
+                 else
+                   str->iso2022.composite_chars = Dynarr_new (unsigned_char);
+                 dst = str->iso2022.composite_chars;
+                 break;
+               case ISO_ESC_END_COMPOSITE:
+                 {
+                   Bufbyte comstr[MAX_EMCHAR_LEN];
+                   Bytecount len;
+                   Emchar emch = lookup_composite_char (Dynarr_atp (dst, 0),
+                                                        Dynarr_length (dst));
+                   dst = real_dst;
+                   len = set_charptr_emchar (comstr, emch);
+                   Dynarr_add_many (dst, comstr, len);
+                   break;
+                 }
+
+               case ISO_ESC_LITERAL:
+                 DECODE_ADD_BINARY_CHAR (c, dst);
+                 break;
+
+               default:
+                 /* Everything else handled already */
+                 break;
+               }
+           }
+
+         /* Attempted error recovery. */
+         if (str->iso2022.output_direction_sequence)
+           ensure_correct_direction (flags & CODING_STATE_R2L ?
+                                     CHARSET_RIGHT_TO_LEFT :
+                                     CHARSET_LEFT_TO_RIGHT,
+                                     str->codesys, dst, 0, 1);
+         /* More error recovery. */
+         if (!retval || str->iso2022.output_literally)
+           {
+             /* Output the (possibly invalid) sequence */
+             int i;
+             for (i = 0; i < str->iso2022.esc_bytes_index; i++)
+               DECODE_ADD_BINARY_CHAR (str->iso2022.esc_bytes[i], dst);
+             flags &= CODING_STATE_ISO2022_LOCK;
+             if (!retval)
+               n++, src--;/* Repeat the loop with the same character. */
+             else
+               {
+                 /* No sense in reprocessing the final byte of the
+                    escape sequence; it could mess things up anyway.
+                    Just add it now. */
+                 DECODE_ADD_BINARY_CHAR (c, dst);
+               }
+           }
+         ch = 0;
+       }
+      else if (BYTE_C0_P (c) || BYTE_C1_P (c))
+       { /* Control characters */
+
+         /***** Error-handling *****/
+
+         /* If we were in the middle of a character, dump out the
+            partial character. */
+         DECODE_OUTPUT_PARTIAL_CHAR (ch);
+
+         /* If we just saw a single-shift character, dump it out.
+            This may dump out the wrong sort of single-shift character,
+            but least it will give an indication that something went
+            wrong. */
+         if (flags & CODING_STATE_SS2)
+           {
+             DECODE_ADD_BINARY_CHAR (ISO_CODE_SS2, dst);
+             flags &= ~CODING_STATE_SS2;
+           }
+         if (flags & CODING_STATE_SS3)
+           {
+             DECODE_ADD_BINARY_CHAR (ISO_CODE_SS3, dst);
+             flags &= ~CODING_STATE_SS3;
+           }
+
+         /***** Now handle the control characters. *****/
+
+         /* Handle CR/LF */
+         DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+
+         flags &= CODING_STATE_ISO2022_LOCK;
+
+         if (!parse_iso2022_esc (coding_system, &str->iso2022, c, &flags, 1))
+           DECODE_ADD_BINARY_CHAR (c, dst);
+       }
+      else
+       {                       /* Graphic characters */
+         Lisp_Object charset;
+         int lb;
+         int reg;
+
+         DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+
+         /* Now determine the charset. */
+         reg = ((flags & CODING_STATE_SS2) ? 2
+                : (flags & CODING_STATE_SS3) ? 3
+                : !BYTE_ASCII_P (c) ? str->iso2022.register_right
+                : str->iso2022.register_left);
+         charset = str->iso2022.charset[reg];
+
+         /* Error checking: */
+         if (NILP (charset) || str->iso2022.invalid_designated[reg]
+             || (((c & 0x7F) == ' ' || (c & 0x7F) == ISO_CODE_DEL)
+                 && XCHARSET_CHARS (charset) == 94))
+           /* Mrmph.  We are trying to invoke a register that has no
+              or an invalid charset in it, or trying to add a character
+              outside the range of the charset.  Insert that char literally
+              to preserve it for the output. */
+           {
+             DECODE_OUTPUT_PARTIAL_CHAR (ch);
+             DECODE_ADD_BINARY_CHAR (c, dst);
+           }
+
+         else
+           {
+             /* Things are probably hunky-dorey. */
+
+             /* Fetch reverse charset, maybe. */
+             if (((flags & CODING_STATE_R2L) &&
+                  XCHARSET_DIRECTION (charset) == CHARSET_LEFT_TO_RIGHT)
+                 ||
+                 (!(flags & CODING_STATE_R2L) &&
+                  XCHARSET_DIRECTION (charset) == CHARSET_RIGHT_TO_LEFT))
+               {
+                 Lisp_Object new_charset =
+                   XCHARSET_REVERSE_DIRECTION_CHARSET (charset);
+                 if (!NILP (new_charset))
+                   charset = new_charset;
+               }
+
+             lb = XCHARSET_LEADING_BYTE (charset);
+             switch (XCHARSET_REP_BYTES (charset))
+               {
+               case 1: /* ASCII */
+                 DECODE_OUTPUT_PARTIAL_CHAR (ch);
+                 Dynarr_add (dst, c & 0x7F);
+                 break;
+
+               case 2: /* one-byte official */
+                 DECODE_OUTPUT_PARTIAL_CHAR (ch);
+                 Dynarr_add (dst, lb);
+                 Dynarr_add (dst, c | 0x80);
+                 break;
+
+               case 3: /* one-byte private or two-byte official */
+                 if (XCHARSET_PRIVATE_P (charset))
+                   {
+                     DECODE_OUTPUT_PARTIAL_CHAR (ch);
+                     Dynarr_add (dst, PRE_LEADING_BYTE_PRIVATE_1);
+                     Dynarr_add (dst, lb);
+                     Dynarr_add (dst, c | 0x80);
+                   }
+                 else
+                   {
+                     if (ch)
+                       {
+                         Dynarr_add (dst, lb);
+                         Dynarr_add (dst, ch | 0x80);
+                         Dynarr_add (dst, c | 0x80);
+                         ch = 0;
+                       }
+                     else
+                       ch = c;
+                   }
+                 break;
+
+               default:        /* two-byte private */
+                 if (ch)
+                   {
+                     Dynarr_add (dst, PRE_LEADING_BYTE_PRIVATE_2);
+                     Dynarr_add (dst, lb);
+                     Dynarr_add (dst, ch | 0x80);
+                     Dynarr_add (dst, c | 0x80);
+                     ch = 0;
+                   }
+                 else
+                   ch = c;
+               }
+           }
+
+         if (!ch)
+           flags &= CODING_STATE_ISO2022_LOCK;
+       }
+
+    label_continue_loop:;
+    }
+
+  if (flags & CODING_STATE_END)
+    DECODE_OUTPUT_PARTIAL_CHAR (ch);
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+
+/***** ISO2022 encoder *****/
+
+/* Designate CHARSET into register REG. */
+
+static void
+iso2022_designate (Lisp_Object charset, unsigned char reg,
+                  struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+  CONST char *inter94 = "()*+", *inter96= ",-./";
+  unsigned int type;
+  unsigned char final;
+  Lisp_Object old_charset = str->iso2022.charset[reg];
+
+  str->iso2022.charset[reg] = charset;
+  if (!CHARSETP (charset))
+    /* charset might be an initial nil or t. */
+    return;
+  type = XCHARSET_TYPE (charset);
+  final = XCHARSET_FINAL (charset);
+  if (!str->iso2022.force_charset_on_output[reg] &&
+      CHARSETP (old_charset) &&
+      XCHARSET_TYPE (old_charset) == type &&
+      XCHARSET_FINAL (old_charset) == final)
+    return;
+
+  str->iso2022.force_charset_on_output[reg] = 0;
+
+  {
+    charset_conversion_spec_dynarr *dyn =
+      str->codesys->iso2022.output_conv;
+
+    if (dyn)
+      {
+       int i;
+
+       for (i = 0; i < Dynarr_length (dyn); i++)
+         {
+           struct charset_conversion_spec *spec = Dynarr_atp (dyn, i);
+           if (EQ (charset, spec->from_charset))
+               charset = spec->to_charset;
+         }
+      }
+  }
+
+  Dynarr_add (dst, ISO_CODE_ESC);
+  switch (type)
+    {
+    case CHARSET_TYPE_94:
+      Dynarr_add (dst, inter94[reg]);
+      break;
+    case CHARSET_TYPE_96:
+      Dynarr_add (dst, inter96[reg]);
+      break;
+    case CHARSET_TYPE_94X94:
+      Dynarr_add (dst, '$');
+      if (reg != 0
+         || !(CODING_SYSTEM_ISO2022_SHORT (str->codesys))
+         || final < '@'
+         || final > 'B')
+       Dynarr_add (dst, inter94[reg]);
+      break;
+    case CHARSET_TYPE_96X96:
+      Dynarr_add (dst, '$');
+      Dynarr_add (dst, inter96[reg]);
+      break;
+    }
+  Dynarr_add (dst, final);
+}
+
+static void
+ensure_normal_shift (struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+  if (str->iso2022.register_left != 0)
+    {
+      Dynarr_add (dst, ISO_CODE_SI);
+      str->iso2022.register_left = 0;
+    }
+}
+
+static void
+ensure_shift_out (struct encoding_stream *str, unsigned_char_dynarr *dst)
+{
+  if (str->iso2022.register_left != 1)
+    {
+      Dynarr_add (dst, ISO_CODE_SO);
+      str->iso2022.register_left = 1;
+    }
+}
+
+/* Convert internally-formatted data to ISO2022 format. */
+
+static void
+encode_coding_iso2022 (Lstream *encoding, CONST unsigned char *src,
+                      unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char charmask, c;
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+  unsigned char char_boundary;
+  struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+  struct Lisp_Coding_System *codesys = str->codesys;
+  int i;
+  Lisp_Object charset;
+  int half;
+
+  /* flags for handling composite chars.  We do a little switcharoo
+     on the source while we're outputting the composite char. */
+  unsigned int saved_n = 0;
+  CONST unsigned char *saved_src = NULL;
+  int in_composite = 0;
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+  char_boundary = str->iso2022.current_char_boundary;
+  charset = str->iso2022.current_charset;
+  half = str->iso2022.current_half;
+
+ back_to_square_n:
+  while (n--)
+    {
+      c = *src++;
+
+      if (BYTE_ASCII_P (c))
+       {               /* Processing ASCII character */
+         ch = 0;
+
+         restore_left_to_right_direction (codesys, dst, &flags, 0);
+
+         /* Make sure G0 contains ASCII */
+         if ((c > ' ' && c < ISO_CODE_DEL) ||
+             !CODING_SYSTEM_ISO2022_NO_ASCII_CNTL (codesys))
+           {
+             ensure_normal_shift (str, dst);
+             iso2022_designate (Vcharset_ascii, 0, str, dst);
+           }
+
+         /* If necessary, restore everything to the default state
+            at end-of-line */
+         if (c == '\n' &&
+             !(CODING_SYSTEM_ISO2022_NO_ASCII_EOL (codesys)))
+           {
+             restore_left_to_right_direction (codesys, dst, &flags, 0);
+
+             ensure_normal_shift (str, dst);
+
+             for (i = 0; i < 4; i++)
+               {
+                 Lisp_Object initial_charset =
+                   CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i);
+                 iso2022_designate (initial_charset, i, str, dst);
+               }
+           }
+         if (c == '\n')
+           {
+             if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+               Dynarr_add (dst, '\r');
+             if (eol_type != EOL_CR)
+               Dynarr_add (dst, c);
+           }
+         else
+           {
+             if (CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+                 && fit_to_be_escape_quoted (c))
+               Dynarr_add (dst, ISO_CODE_ESC);
+             Dynarr_add (dst, c);
+           }
+         char_boundary = 1;
+       }
+
+      else if (BUFBYTE_LEADING_BYTE_P (c) || BUFBYTE_LEADING_BYTE_P (ch))
+       { /* Processing Leading Byte */
+         ch = 0;
+         charset = CHARSET_BY_LEADING_BYTE (c);
+         if (LEADING_BYTE_PREFIX_P(c))
+           ch = c;
+         else if (!EQ (charset, Vcharset_control_1)
+                  && !EQ (charset, Vcharset_composite))
+           {
+             int reg;
+
+             ensure_correct_direction (XCHARSET_DIRECTION (charset),
+                                       codesys, dst, &flags, 0);
+
+             /* Now determine which register to use. */
+             reg = -1;
+             for (i = 0; i < 4; i++)
+               {
+                 if (EQ (charset, str->iso2022.charset[i]) ||
+                     EQ (charset,
+                         CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i)))
+                   {
+                     reg = i;
+                     break;
+                   }
+               }
+
+             if (reg == -1)
+               {
+                 if (XCHARSET_GRAPHIC (charset) != 0)
+                   {
+                     if (!NILP (str->iso2022.charset[1]) &&
+                         (!CODING_SYSTEM_ISO2022_SEVEN (codesys) ||
+                          CODING_SYSTEM_ISO2022_LOCK_SHIFT (codesys)))
+                       reg = 1;
+                     else if (!NILP (str->iso2022.charset[2]))
+                       reg = 2;
+                     else if (!NILP (str->iso2022.charset[3]))
+                       reg = 3;
+                     else
+                       reg = 0;
+                   }
+                 else
+                   reg = 0;
+               }
+
+             iso2022_designate (charset, reg, str, dst);
+
+             /* Now invoke that register. */
+             switch (reg)
+               {
+               case 0:
+                 ensure_normal_shift (str, dst);
+                 half = 0;
+                 break;
+
+               case 1:
+                 if (CODING_SYSTEM_ISO2022_SEVEN (codesys))
+                   {
+                     ensure_shift_out (str, dst);
+                     half = 0;
+                   }
+                 else
+                   half = 1;
+                 break;
+
+               case 2:
+                 if (CODING_SYSTEM_ISO2022_SEVEN (str->codesys))
+                   {
+                     Dynarr_add (dst, ISO_CODE_ESC);
+                     Dynarr_add (dst, 'N');
+                     half = 0;
+                   }
+                 else
+                   {
+                     Dynarr_add (dst, ISO_CODE_SS2);
+                     half = 1;
+                   }
+                 break;
+
+               case 3:
+                 if (CODING_SYSTEM_ISO2022_SEVEN (str->codesys))
+                   {
+                     Dynarr_add (dst, ISO_CODE_ESC);
+                     Dynarr_add (dst, 'O');
+                     half = 0;
+                   }
+                 else
+                   {
+                     Dynarr_add (dst, ISO_CODE_SS3);
+                     half = 1;
+                   }
+                 break;
+
+               default:
+                 abort ();
+               }
+           }
+         char_boundary = 0;
+       }
+      else
+       {                       /* Processing Non-ASCII character */
+         charmask = (half == 0 ? 0x7F : 0xFF);
+         char_boundary = 1;
+         if (EQ (charset, Vcharset_control_1))
+           {
+             if (CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (codesys)
+                 && fit_to_be_escape_quoted (c))
+               Dynarr_add (dst, ISO_CODE_ESC);
+             /* you asked for it ... */
+             Dynarr_add (dst, c - 0x20);
+           }
+         else
+           {
+             switch (XCHARSET_REP_BYTES (charset))
+               {
+               case 2:
+                 Dynarr_add (dst, c & charmask);
+                 break;
+               case 3:
+                 if (XCHARSET_PRIVATE_P (charset))
+                   {
+                     Dynarr_add (dst, c & charmask);
+                     ch = 0;
+                   }
+                 else if (ch)
+                   {
+                     if (EQ (charset, Vcharset_composite))
+                       {
+                         if (in_composite)
+                           {
+                             /* #### Bother! We don't know how to
+                                handle this yet. */
+                             Dynarr_add (dst, '~');
+                           }
+                         else
+                           {
+                             Emchar emch = MAKE_CHAR (Vcharset_composite,
+                                                      ch & 0x7F, c & 0x7F);
+                             Lisp_Object lstr = composite_char_string (emch);
+                             saved_n = n;
+                             saved_src = src;
+                             in_composite = 1;
+                             src = XSTRING_DATA   (lstr);
+                             n   = XSTRING_LENGTH (lstr);
+                             Dynarr_add (dst, ISO_CODE_ESC);
+                             Dynarr_add (dst, '0'); /* start composing */
+                           }
+                       }
+                     else
+                       {
+                         Dynarr_add (dst, ch & charmask);
+                         Dynarr_add (dst, c & charmask);
+                       }
+                     ch = 0;
+                   }
+                 else
+                   {
+                     ch = c;
+                     char_boundary = 0;
+                   }
+                 break;
+               case 4:
+                 if (ch)
+                   {
+                     Dynarr_add (dst, ch & charmask);
+                     Dynarr_add (dst, c & charmask);
+                     ch = 0;
+                   }
+                 else
+                   {
+                     ch = c;
+                     char_boundary = 0;
+                   }
+                 break;
+               default:
+                 abort ();
+               }
+           }
+       }
+    }
+
+  if (in_composite)
+    {
+      n = saved_n;
+      src = saved_src;
+      in_composite = 0;
+      Dynarr_add (dst, ISO_CODE_ESC);
+      Dynarr_add (dst, '1'); /* end composing */
+      goto back_to_square_n; /* Wheeeeeeeee ..... */
+    }
+
+  if (char_boundary && flags & CODING_STATE_END)
+    {
+      restore_left_to_right_direction (codesys, dst, &flags, 0);
+      ensure_normal_shift (str, dst);
+      for (i = 0; i < 4; i++)
+       {
+         Lisp_Object initial_charset =
+           CODING_SYSTEM_ISO2022_INITIAL_CHARSET (codesys, i);
+         iso2022_designate (initial_charset, i, str, dst);
+       }
+    }
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+  str->iso2022.current_char_boundary = char_boundary;
+  str->iso2022.current_charset = charset;
+  str->iso2022.current_half = half;
+
+  /* Verbum caro factum est! */
+}
+
+\f
+/************************************************************************/
+/*                     No-conversion methods                            */
+/************************************************************************/
+
+/* This is used when reading in "binary" files -- i.e. files that may
+   contain all 256 possible byte values and that are not to be
+   interpreted as being in any particular decoding. */
+static void
+decode_coding_no_conversion (Lstream *decoding, CONST unsigned char *src,
+                            unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+  struct decoding_stream *str = DECODING_STREAM_DATA (decoding);
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = str->eol_type;
+
+  while (n--)
+    {
+      c = *src++;
+
+      DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst);
+      DECODE_ADD_BINARY_CHAR (c, dst);
+    label_continue_loop:;
+    }
+
+  DECODE_HANDLE_END_OF_CONVERSION (flags, ch, dst);
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+static void
+encode_coding_no_conversion (Lstream *encoding, CONST unsigned char *src,
+                            unsigned_char_dynarr *dst, unsigned int n)
+{
+  unsigned char c;
+  struct encoding_stream *str = ENCODING_STREAM_DATA (encoding);
+  unsigned int flags, ch;
+  enum eol_type eol_type;
+
+  CODING_STREAM_DECOMPOSE (str, flags, ch);
+  eol_type = CODING_SYSTEM_EOL_TYPE (str->codesys);
+
+  while (n--)
+    {
+      c = *src++;
+      if (c == '\n')
+       {
+         if (eol_type != EOL_LF && eol_type != EOL_AUTODETECT)
+           Dynarr_add (dst, '\r');
+         if (eol_type != EOL_CR)
+           Dynarr_add (dst, '\n');
+         ch = 0;
+       }
+      else if (BYTE_ASCII_P (c))
+       {
+         assert (ch == 0);
+         Dynarr_add (dst, c);
+       }
+      else if (BUFBYTE_LEADING_BYTE_P (c))
+       {
+         assert (ch == 0);
+         if (c == LEADING_BYTE_LATIN_ISO8859_1 ||
+             c == LEADING_BYTE_CONTROL_1)
+           ch = c;
+         else
+           Dynarr_add (dst, '~'); /* untranslatable character */
+       }
+      else
+       {
+         if (ch == LEADING_BYTE_LATIN_ISO8859_1)
+           Dynarr_add (dst, c);
+         else if (ch == LEADING_BYTE_CONTROL_1)
+           {
+             assert (c < 0xC0);
+             Dynarr_add (dst, c - 0x20);
+           }
+         /* else it should be the second or third byte of an
+            untranslatable character, so ignore it */
+         ch = 0;
+       }
+    }
+
+  CODING_STREAM_COMPOSE (str, flags, ch);
+}
+
+\f
+/************************************************************************/
+/*                   Simple internal/external functions                 */
+/************************************************************************/
+
+static Extbyte_dynarr *conversion_out_dynarr;
+static Bufbyte_dynarr *conversion_in_dynarr;
+
+/* Determine coding system from coding format */
+
+#define FILE_NAME_CODING_SYSTEM                        \
+ ((NILP (Vfile_name_coding_system) ||                  \
+   (EQ ((Vfile_name_coding_system), Qbinary))) ?       \
+  Qnil : Fget_coding_system (Vfile_name_coding_system))
+
+/* #### not correct for all values of `fmt'! */
+#define FMT_CODING_SYSTEM(fmt)                                 \
+ (((fmt) == FORMAT_FILENAME) ? FILE_NAME_CODING_SYSTEM     :   \
+  ((fmt) == FORMAT_CTEXT   ) ? Fget_coding_system (Qctext) :   \
+  ((fmt) == FORMAT_TERMINAL) ? FILE_NAME_CODING_SYSTEM     :   \
+  Qnil)
+
+CONST Extbyte *
+convert_to_external_format (CONST Bufbyte *ptr,
+                           Bytecount len,
+                           Extcount *len_out,
+                           enum external_data_format fmt)
+{
+  Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
+
+  if (!conversion_out_dynarr)
+    conversion_out_dynarr = Dynarr_new (Extbyte);
+  else
+    Dynarr_reset (conversion_out_dynarr);
+
+  if (NILP (coding_system))
+    {
+      CONST Bufbyte *end = ptr + len;
+
+      for (; ptr < end;)
+        {
+          Bufbyte c =
+            (BYTE_ASCII_P (*ptr))                 ? *ptr :
+            (*ptr == LEADING_BYTE_CONTROL_1)      ? (*(ptr+1) - 0x20) :
+            (*ptr == LEADING_BYTE_LATIN_ISO8859_1) ? (*(ptr+1)) :
+            '~';
+
+          Dynarr_add (conversion_out_dynarr, (Extbyte) c);
+          INC_CHARPTR (ptr);
+        }
+
+#ifdef ERROR_CHECK_BUFPOS
+      assert (ptr == end);
+#endif
+    }
+  else
+    {
+      Lisp_Object instream, outstream, da_outstream;
+      Lstream *istr, *ostr;
+      struct gcpro gcpro1, gcpro2, gcpro3;
+      char tempbuf[1024]; /* some random amount */
+
+      instream = make_fixed_buffer_input_stream ((unsigned char *) ptr, len);
+      da_outstream = make_dynarr_output_stream
+        ((unsigned_char_dynarr *) conversion_out_dynarr);
+      outstream =
+        make_encoding_output_stream (XLSTREAM (da_outstream), coding_system);
+      istr = XLSTREAM (instream);
+      ostr = XLSTREAM (outstream);
+      GCPRO3 (instream, outstream, da_outstream);
+      while (1)
+        {
+          int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+          if (!size_in_bytes)
+            break;
+          Lstream_write (ostr, tempbuf, size_in_bytes);
+        }
+      Lstream_close (istr);
+      Lstream_close (ostr);
+      UNGCPRO;
+      Lstream_delete (istr);
+      Lstream_delete (ostr);
+      Lstream_delete (XLSTREAM (da_outstream));
+    }
+
+  *len_out = Dynarr_length (conversion_out_dynarr);
+  Dynarr_add (conversion_out_dynarr, 0); /* remember to zero-terminate! */
+  return Dynarr_atp (conversion_out_dynarr, 0);
+}
+
+CONST Bufbyte *
+convert_from_external_format (CONST Extbyte *ptr,
+                             Extcount len,
+                             Bytecount *len_out,
+                             enum external_data_format fmt)
+{
+  Lisp_Object coding_system = FMT_CODING_SYSTEM (fmt);
+
+  if (!conversion_in_dynarr)
+    conversion_in_dynarr = Dynarr_new (Bufbyte);
+  else
+    Dynarr_reset (conversion_in_dynarr);
+
+  if (NILP (coding_system))
+    {
+      CONST Extbyte *end = ptr + len;
+      for (; ptr < end; ptr++)
+        {
+          Extbyte c = *ptr;
+          DECODE_ADD_BINARY_CHAR (c, conversion_in_dynarr);
+        }
+    }
+  else
+    {
+      Lisp_Object instream, outstream, da_outstream;
+      Lstream *istr, *ostr;
+      struct gcpro gcpro1, gcpro2, gcpro3;
+      char tempbuf[1024]; /* some random amount */
+
+      instream = make_fixed_buffer_input_stream ((unsigned char *) ptr, len);
+      da_outstream = make_dynarr_output_stream
+        ((unsigned_char_dynarr *) conversion_in_dynarr);
+      outstream =
+        make_decoding_output_stream (XLSTREAM (da_outstream), coding_system);
+      istr = XLSTREAM (instream);
+      ostr = XLSTREAM (outstream);
+      GCPRO3 (instream, outstream, da_outstream);
+      while (1)
+        {
+          int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
+          if (!size_in_bytes)
+            break;
+          Lstream_write (ostr, tempbuf, size_in_bytes);
+        }
+      Lstream_close (istr);
+      Lstream_close (ostr);
+      UNGCPRO;
+      Lstream_delete (istr);
+      Lstream_delete (ostr);
+      Lstream_delete (XLSTREAM (da_outstream));
+    }
+
+  *len_out = Dynarr_length (conversion_in_dynarr);
+  Dynarr_add (conversion_in_dynarr, 0); /* remember to zero-terminate! */
+  return Dynarr_atp (conversion_in_dynarr, 0);
+}
+
+\f
+/************************************************************************/
+/*                             Initialization                           */
+/************************************************************************/
+
+void
+syms_of_mule_coding (void)
+{
+  defsymbol (&Qbuffer_file_coding_system, "buffer-file-coding-system");
+  deferror (&Qcoding_system_error, "coding-system-error",
+           "Coding-system error", Qio_error);
+
+  DEFSUBR (Fcoding_system_p);
+  DEFSUBR (Ffind_coding_system);
+  DEFSUBR (Fget_coding_system);
+  DEFSUBR (Fcoding_system_list);
+  DEFSUBR (Fcoding_system_name);
+  DEFSUBR (Fmake_coding_system);
+  DEFSUBR (Fcopy_coding_system);
+  DEFSUBR (Fsubsidiary_coding_system);
+
+  DEFSUBR (Fcoding_system_type);
+  DEFSUBR (Fcoding_system_doc_string);
+  DEFSUBR (Fcoding_system_charset);
+  DEFSUBR (Fcoding_system_property);
+
+  DEFSUBR (Fcoding_category_list);
+  DEFSUBR (Fset_coding_priority_list);
+  DEFSUBR (Fcoding_priority_list);
+  DEFSUBR (Fset_coding_category_system);
+  DEFSUBR (Fcoding_category_system);
+
+  DEFSUBR (Fdetect_coding_region);
+  DEFSUBR (Fdecode_coding_region);
+  DEFSUBR (Fencode_coding_region);
+  DEFSUBR (Fdecode_shift_jis_char);
+  DEFSUBR (Fencode_shift_jis_char);
+  DEFSUBR (Fdecode_big5_char);
+  DEFSUBR (Fencode_big5_char);
+
+  defsymbol (&Qcoding_system_p, "coding-system-p");
+
+  defsymbol (&Qbig5, "big5");
+  defsymbol (&Qshift_jis, "shift-jis");
+  defsymbol (&Qno_conversion, "no-conversion");
+  defsymbol (&Qccl, "ccl");
+  defsymbol (&Qiso2022, "iso2022");
+
+  defsymbol (&Qmnemonic, "mnemonic");
+  defsymbol (&Qeol_type, "eol-type");
+  defsymbol (&Qpost_read_conversion, "post-read-conversion");
+  defsymbol (&Qpre_write_conversion, "pre-write-conversion");
+
+  defsymbol (&Qcr, "cr");
+  defsymbol (&Qlf, "lf");
+  defsymbol (&Qcrlf, "crlf");
+  defsymbol (&Qeol_cr, "eol-cr");
+  defsymbol (&Qeol_lf, "eol-lf");
+  defsymbol (&Qeol_crlf, "eol-crlf");
+
+  defsymbol (&Qcharset_g0, "charset-g0");
+  defsymbol (&Qcharset_g1, "charset-g1");
+  defsymbol (&Qcharset_g2, "charset-g2");
+  defsymbol (&Qcharset_g3, "charset-g3");
+  defsymbol (&Qforce_g0_on_output, "force-g0-on-output");
+  defsymbol (&Qforce_g1_on_output, "force-g1-on-output");
+  defsymbol (&Qforce_g2_on_output, "force-g2-on-output");
+  defsymbol (&Qforce_g3_on_output, "force-g3-on-output");
+  defsymbol (&Qshort, "short");
+  defsymbol (&Qno_ascii_eol, "no-ascii-eol");
+  defsymbol (&Qno_ascii_cntl, "no-ascii-cntl");
+  defsymbol (&Qseven, "seven");
+  defsymbol (&Qlock_shift, "lock-shift");
+  defsymbol (&Qno_iso6429, "no-iso6429");
+  defsymbol (&Qescape_quoted, "escape-quoted");
+  defsymbol (&Qinput_charset_conversion, "input-charset-conversion");
+  defsymbol (&Qoutput_charset_conversion, "output-charset-conversion");
+
+  defsymbol (&Qencode, "encode");
+  defsymbol (&Qdecode, "decode");
+
+  defsymbol (&Qctext, "ctext");
+
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_SHIFT_JIS],
+            "shift-jis");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_7],
+            "iso-7");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_DESIGNATE],
+            "iso-8-designate");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_1],
+            "iso-8-1");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_8_2],
+            "iso-8-2");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_ISO_LOCK_SHIFT],
+            "iso-lock-shift");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_BIG5],
+            "big5");
+  defsymbol (&coding_category_symbol[CODING_CATEGORY_NO_CONVERSION],
+            "no-conversion");
+}
+
+void
+lstream_type_create_mule_coding (void)
+{
+  LSTREAM_HAS_METHOD (decoding, reader);
+  LSTREAM_HAS_METHOD (decoding, writer);
+  LSTREAM_HAS_METHOD (decoding, rewinder);
+  LSTREAM_HAS_METHOD (decoding, seekable_p);
+  LSTREAM_HAS_METHOD (decoding, flusher);
+  LSTREAM_HAS_METHOD (decoding, closer);
+  LSTREAM_HAS_METHOD (decoding, marker);
+
+  LSTREAM_HAS_METHOD (encoding, reader);
+  LSTREAM_HAS_METHOD (encoding, writer);
+  LSTREAM_HAS_METHOD (encoding, rewinder);
+  LSTREAM_HAS_METHOD (encoding, seekable_p);
+  LSTREAM_HAS_METHOD (encoding, flusher);
+  LSTREAM_HAS_METHOD (encoding, closer);
+  LSTREAM_HAS_METHOD (encoding, marker);
+}
+
+void
+vars_of_mule_coding (void)
+{
+  int i;
+
+  /* Initialize to something reasonable ... */
+  for (i = 0; i <= CODING_CATEGORY_LAST; i++)
+    {
+      coding_category_system[i] = Qnil;
+      coding_category_by_priority[i] = i;
+    }
+
+  DEFVAR_LISP ("keyboard-coding-system", &Vkeyboard_coding_system /*
+Coding system used for TTY keyboard input.
+Not used under a windowing system.
+*/ );
+  Vkeyboard_coding_system = Qnil;
+
+  DEFVAR_LISP ("terminal-coding-system", &Vterminal_coding_system /*
+Coding system used for TTY display output.
+Not used under a windowing system.
+*/ );
+  Vterminal_coding_system = Qnil;
+
+  DEFVAR_LISP ("coding-system-for-read", &Vcoding_system_for_read /*
+Overriding coding system used when writing a file or process.
+You should *bind* this, not set it.  If this is non-nil, it specifies
+the coding system that will be used when a file or process is read
+in, and overrides `buffer-file-coding-system-for-read',
+`insert-file-contents-pre-hook', etc.  Use those variables instead of
+this one for permanent changes to the environment.
+*/ );
+  Vcoding_system_for_read = Qnil;
+
+  DEFVAR_LISP ("coding-system-for-write",
+               &Vcoding_system_for_write /*
+Overriding coding system used when writing a file or process.
+You should *bind* this, not set it.  If this is non-nil, it specifies
+the coding system that will be used when a file or process is wrote
+in, and overrides `buffer-file-coding-system',
+`write-region-pre-hook', etc.  Use those variables instead of this one
+for permanent changes to the environment.
+*/ );
+  Vcoding_system_for_write = Qnil;
+
+  DEFVAR_LISP ("file-name-coding-system", &Vfile_name_coding_system /*
+Coding system used to convert pathnames when accessing files.
+*/ );
+  Vfile_name_coding_system = Qnil;
+
+  DEFVAR_BOOL ("enable-multibyte-characters", &enable_multibyte_characters /*
+Non-nil means the buffer contents are regarded as multi-byte form
+of characters, not a binary code.  This affects the display, file I/O,
+and behaviors of various editing commands.
+
+Setting this to nil does not do anything.
+*/ );
+  enable_multibyte_characters = 1;
+}
+
+void
+complex_vars_of_mule_coding (void)
+{
+  staticpro (&Vcoding_system_hashtable);
+  Vcoding_system_hashtable = make_lisp_hashtable (50, HASHTABLE_NONWEAK,
+                                                 HASHTABLE_EQ);
+
+  the_codesys_prop_dynarr = Dynarr_new (codesys_prop);
+
+#define DEFINE_CODESYS_PROP(Prop_Type, Sym) do \
+{                                              \
+  struct codesys_prop csp;                     \
+  csp.sym = (Sym);                             \
+  csp.prop_type = (Prop_Type);                 \
+  Dynarr_add (the_codesys_prop_dynarr, csp);   \
+} while (0)
+
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qmnemonic);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qeol_type);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qeol_cr);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qeol_crlf);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qeol_lf);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qpost_read_conversion);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ALL_OK,  Qpre_write_conversion);
+
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g0);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g1);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g2);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qcharset_g3);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g0_on_output);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g1_on_output);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g2_on_output);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qforce_g3_on_output);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qshort);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_ascii_eol);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_ascii_cntl);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qseven);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qlock_shift);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qno_iso6429);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qescape_quoted);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qinput_charset_conversion);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_ISO2022, Qoutput_charset_conversion);
+
+  DEFINE_CODESYS_PROP (CODESYS_PROP_CCL,     Qencode);
+  DEFINE_CODESYS_PROP (CODESYS_PROP_CCL,     Qdecode);
+
+  /* Need to create this here or we're really screwed. */
+  Fmake_coding_system (Qno_conversion, Qno_conversion, build_string ("No conversion"),
+                      list2 (Qmnemonic, build_string ("Noconv")));
+
+  Fcopy_coding_system (Fcoding_system_property (Qno_conversion, Qeol_lf),
+                      Qbinary);
+
+  /* Need this for bootstrapping */
+  coding_category_system[CODING_CATEGORY_NO_CONVERSION] =
+    Fget_coding_system (Qno_conversion);
+}
+
+#endif
diff --git a/src/mule-coding.h b/src/mule-coding.h
new file mode 100644 (file)
index 0000000..7c631d9
--- /dev/null
@@ -0,0 +1,450 @@
+/* Header for code conversion stuff
+   Copyright (C) 1991, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Mule 2.3.  Not in FSF. */
+
+/* 91.10.09 written by K.Handa <handa@etl.go.jp> */
+/* Rewritten by Ben Wing <ben@xemacs.org>. */
+
+#ifndef _XEMACS_MULE_CODING_H_
+#define _XEMACS_MULE_CODING_H_
+
+struct decoding_stream;
+struct encoding_stream;
+
+/* Coding system types.  These go into the TYPE field of a
+   struct Lisp_Coding_System. */
+
+enum coding_system_type
+{
+  CODESYS_AUTODETECT,  /* Automatic conversion. */
+  CODESYS_SHIFT_JIS,   /* Shift-JIS; Hankaku (half-width) KANA
+                          is also supported. */
+  CODESYS_ISO2022,     /* Any ISO2022-compliant coding system.
+                          Includes JIS, EUC, CTEXT */
+  CODESYS_BIG5,                /* BIG5 (used for Taiwanese). */
+  CODESYS_CCL,         /* Converter written in CCL. */
+  CODESYS_NO_CONVERSION        /* "No conversion"; used for binary files.
+                          We use quotes because there really
+                          is some conversion being applied,
+                          but it appears to the user as if
+                          the text is read in without conversion. */
+#ifdef DEBUG_XEMACS
+  ,CODESYS_INTERNAL    /* Raw (internally-formatted) data. */
+#endif
+};
+
+enum eol_type
+{
+  EOL_AUTODETECT,
+  EOL_LF,
+  EOL_CRLF,
+  EOL_CR
+};
+
+typedef struct charset_conversion_spec charset_conversion_spec;
+struct charset_conversion_spec
+{
+  Lisp_Object from_charset;
+  Lisp_Object to_charset;
+};
+
+typedef struct
+{
+  Dynarr_declare (charset_conversion_spec);
+} charset_conversion_spec_dynarr;
+
+struct Lisp_Coding_System
+{
+  struct lcrecord_header header;
+
+  /* Name and doc string of this coding system. */
+  Lisp_Object name, doc_string;
+
+  /* This is the major type of the coding system -- one of Big5, ISO2022,
+     Shift-JIS, etc.  See the constants above. */
+  enum coding_system_type type;
+
+  /* Mnemonic string displayed in the modeline when this coding
+     system is active for a particular buffer. */
+  Lisp_Object mnemonic;
+
+  Lisp_Object post_read_conversion, pre_write_conversion;
+
+  enum eol_type eol_type;
+
+  /* Subsidiary coding systems that specify a particular type of EOL
+     marking, rather than autodetecting it.  These will only be non-nil
+     if (eol_type == EOL_AUTODETECT). */
+  Lisp_Object eol_lf, eol_crlf, eol_cr;
+
+  struct
+  {
+    /* What are the charsets to be initially designated to G0, G1,
+       G2, G3?  If t, no charset is initially designated.  If nil,
+       no charset is initially designated and no charset is allowed
+       to be designated. */
+    Lisp_Object initial_charset[4];
+
+    /* If true, a designation escape sequence needs to be sent on output
+       for the charset in G[0-3] before that charset is used. */
+    unsigned char force_charset_on_output[4];
+
+    charset_conversion_spec_dynarr *input_conv;
+    charset_conversion_spec_dynarr *output_conv;
+
+    unsigned int shoort                :1; /* C makes you speak Dutch */
+    unsigned int no_ascii_eol  :1;
+    unsigned int no_ascii_cntl :1;
+    unsigned int seven         :1;
+    unsigned int lock_shift    :1;
+    unsigned int no_iso6429    :1;
+    unsigned int escape_quoted :1;
+  } iso2022;
+
+  struct
+  {
+    /* For a CCL coding system, these specify the CCL programs used for
+       decoding (input) and encoding (output). */
+    Lisp_Object decode, encode;
+  } ccl;
+};
+
+DECLARE_LRECORD (coding_system, struct Lisp_Coding_System);
+#define XCODING_SYSTEM(x) XRECORD (x, coding_system, struct Lisp_Coding_System)
+#define XSETCODING_SYSTEM(x, p) XSETRECORD (x, p, coding_system)
+#define CODING_SYSTEMP(x) RECORDP (x, coding_system)
+#define GC_CODING_SYSTEMP(x) GC_RECORDP (x, coding_system)
+#define CHECK_CODING_SYSTEM(x) CHECK_RECORD (x, coding_system)
+#define CONCHECK_CODING_SYSTEM(x) CONCHECK_RECORD (x, coding_system)
+
+#define CODING_SYSTEM_NAME(codesys) ((codesys)->name)
+#define CODING_SYSTEM_DOC_STRING(codesys) ((codesys)->doc_string)
+#define CODING_SYSTEM_TYPE(codesys) ((codesys)->type)
+#define CODING_SYSTEM_MNEMONIC(codesys) ((codesys)->mnemonic)
+#define CODING_SYSTEM_POST_READ_CONVERSION(codesys) \
+  ((codesys)->post_read_conversion)
+#define CODING_SYSTEM_PRE_WRITE_CONVERSION(codesys) \
+  ((codesys)->pre_write_conversion)
+#define CODING_SYSTEM_EOL_TYPE(codesys) ((codesys)->eol_type)
+#define CODING_SYSTEM_EOL_LF(codesys)   ((codesys)->eol_lf)
+#define CODING_SYSTEM_EOL_CRLF(codesys) ((codesys)->eol_crlf)
+#define CODING_SYSTEM_EOL_CR(codesys)   ((codesys)->eol_cr)
+#define CODING_SYSTEM_ISO2022_INITIAL_CHARSET(codesys, g) \
+  ((codesys)->iso2022.initial_charset[g])
+#define CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT(codesys, g) \
+  ((codesys)->iso2022.force_charset_on_output[g])
+#define CODING_SYSTEM_ISO2022_SHORT(codesys) ((codesys)->iso2022.shoort)
+#define CODING_SYSTEM_ISO2022_NO_ASCII_EOL(codesys) \
+  ((codesys)->iso2022.no_ascii_eol)
+#define CODING_SYSTEM_ISO2022_NO_ASCII_CNTL(codesys) \
+  ((codesys)->iso2022.no_ascii_cntl)
+#define CODING_SYSTEM_ISO2022_SEVEN(codesys) ((codesys)->iso2022.seven)
+#define CODING_SYSTEM_ISO2022_LOCK_SHIFT(codesys) \
+  ((codesys)->iso2022.lock_shift)
+#define CODING_SYSTEM_ISO2022_NO_ISO6429(codesys) \
+  ((codesys)->iso2022.no_iso6429)
+#define CODING_SYSTEM_ISO2022_ESCAPE_QUOTED(codesys) \
+  ((codesys)->iso2022.escape_quoted)
+#define CODING_SYSTEM_CCL_DECODE(codesys) ((codesys)->ccl.decode)
+#define CODING_SYSTEM_CCL_ENCODE(codesys) ((codesys)->ccl.encode)
+
+#define XCODING_SYSTEM_NAME(codesys) \
+  CODING_SYSTEM_NAME (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_DOC_STRING(codesys) \
+  CODING_SYSTEM_DOC_STRING (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_TYPE(codesys) \
+  CODING_SYSTEM_TYPE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_MNEMONIC(codesys) \
+  CODING_SYSTEM_MNEMONIC (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_POST_READ_CONVERSION(codesys) \
+  CODING_SYSTEM_POST_READ_CONVERSION (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_PRE_WRITE_CONVERSION(codesys) \
+  CODING_SYSTEM_PRE_WRITE_CONVERSION (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_TYPE(codesys) \
+  CODING_SYSTEM_EOL_TYPE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_LF(codesys) \
+  CODING_SYSTEM_EOL_LF (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_CRLF(codesys) \
+  CODING_SYSTEM_EOL_CRLF (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_EOL_CR(codesys) \
+  CODING_SYSTEM_EOL_CR (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_INITIAL_CHARSET(codesys, g) \
+  CODING_SYSTEM_ISO2022_INITIAL_CHARSET (XCODING_SYSTEM (codesys), g)
+#define XCODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT(codesys, g) \
+  CODING_SYSTEM_ISO2022_FORCE_CHARSET_ON_OUTPUT (XCODING_SYSTEM (codesys), g)
+#define XCODING_SYSTEM_ISO2022_SHORT(codesys) \
+  CODING_SYSTEM_ISO2022_SHORT (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ASCII_EOL(codesys) \
+  CODING_SYSTEM_ISO2022_NO_ASCII_EOL (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ASCII_CNTL(codesys) \
+  CODING_SYSTEM_ISO2022_NO_ASCII_CNTL (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_SEVEN(codesys) \
+  CODING_SYSTEM_ISO2022_SEVEN (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_LOCK_SHIFT(codesys) \
+  CODING_SYSTEM_ISO2022_LOCK_SHIFT (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_NO_ISO6429(codesys) \
+  CODING_SYSTEM_ISO2022_NO_ISO6429 (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_ISO2022_ESCAPE_QUOTED(codesys) \
+  CODING_SYSTEM_ISO2022_ESCAPE_QUOTED (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_CCL_DECODE(codesys) \
+  CODING_SYSTEM_CCL_DECODE (XCODING_SYSTEM (codesys))
+#define XCODING_SYSTEM_CCL_ENCODE(codesys) \
+  CODING_SYSTEM_CCL_ENCODE (XCODING_SYSTEM (codesys))
+
+extern Lisp_Object Qbuffer_file_coding_system, Qcoding_system_error;
+
+extern Lisp_Object Vkeyboard_coding_system;
+extern Lisp_Object Vterminal_coding_system;
+extern Lisp_Object Vcoding_system_for_read;
+extern Lisp_Object Vcoding_system_for_write;
+extern Lisp_Object Vpathname_coding_system;
+
+extern Lisp_Object Qescape_quoted;
+
+/* Flags indicating current state while converting code. */
+
+/* Used by everyone. */
+
+#define CODING_STATE_END       (1 << 0) /* If set, this is the last chunk of
+                                           data being processed.  When this
+                                           is finished, output any necessary
+                                           terminating control characters,
+                                           escape sequences, etc. */
+#define CODING_STATE_CR                (1 << 1) /* If set, we just saw a CR. */
+
+
+/* Used by Big 5 on output. */
+
+#define CODING_STATE_BIG5_1    (1 << 2) /* If set, we just encountered
+                                           LEADING_BYTE_BIG5_1. */
+#define CODING_STATE_BIG5_2    (1 << 3) /* If set, we just encountered
+                                           LEADING_BYTE_BIG5_2. */
+
+
+/* Used by ISO2022 on input and output. */
+
+#define CODING_STATE_R2L       (1 << 4)  /* If set, the current
+                                            directionality is right-to-left.
+                                            Otherwise, it's left-to-right. */
+
+
+/* Used by ISO2022 on input. */
+
+#define CODING_STATE_ESCAPE    (1 << 5)  /* If set, we're currently parsing
+                                            an escape sequence and the upper
+                                            16 bits should be looked at to
+                                            indicate what partial escape
+                                            sequence we've seen so far.
+                                            Otherwise, we're running
+                                            through actual text. */
+#define CODING_STATE_SS2       (1 << 6)  /* If set, G2 is invoked into GL, but
+                                            only for the next character. */
+#define CODING_STATE_SS3       (1 << 7)  /* If set, G3 is invoked into GL,
+                                            but only for the next character.
+                                            If both CODING_STATE_SS2 and
+                                            CODING_STATE_SS3 are set,
+                                            CODING_STATE_SS2 overrides; but
+                                            this probably indicates an error
+                                            in the text encoding. */
+#define CODING_STATE_COMPOSITE  (1 << 8)  /* If set, we're currently processing
+                                            a composite character (i.e. a
+                                            character constructed by
+                                            overstriking two or more
+                                            characters). */
+
+
+/* CODING_STATE_ISO2022_LOCK is the mask of flags that remain on until
+   explicitly turned off when in the ISO2022 encoder/decoder.  Other flags are
+   turned off at the end of processing each character or escape sequence. */
+# define CODING_STATE_ISO2022_LOCK \
+  (CODING_STATE_END | CODING_STATE_COMPOSITE | CODING_STATE_R2L)
+#define CODING_STATE_BIG5_LOCK \
+  CODING_STATE_END
+
+/* Flags indicating what we've seen so far when parsing an
+   ISO2022 escape sequence. */
+enum iso_esc_flag
+{
+  /* Partial sequences */
+  ISO_ESC_NOTHING,     /* Nothing has been seen. */
+  ISO_ESC,             /* We've seen ESC. */
+  ISO_ESC_2_4,         /* We've seen ESC $.  This indicates
+                          that we're designating a multi-byte, rather
+                          than a single-byte, character set. */
+  ISO_ESC_2_8,         /* We've seen ESC 0x28, i.e. ESC (.
+                          This means designate a 94-character
+                          character set into G0. */
+  ISO_ESC_2_9,         /* We've seen ESC 0x29 -- designate a
+                          94-character character set into G1. */
+  ISO_ESC_2_10,                /* We've seen ESC 0x2A. */
+  ISO_ESC_2_11,                /* We've seen ESC 0x2B. */
+  ISO_ESC_2_12,                /* We've seen ESC 0x2C -- designate a
+                          96-character character set into G0.
+                          (This is not ISO2022-standard.
+                          The following 96-character
+                          control sequences are standard,
+                          though.) */
+  ISO_ESC_2_13,                /* We've seen ESC 0x2D -- designate a
+                          96-character character set into G1.
+                          */
+  ISO_ESC_2_14,                /* We've seen ESC 0x2E. */
+  ISO_ESC_2_15,                /* We've seen ESC 0x2F. */
+  ISO_ESC_2_4_8,       /* We've seen ESC $ 0x28 -- designate
+                          a 94^N character set into G0. */
+  ISO_ESC_2_4_9,       /* We've seen ESC $ 0x29. */
+  ISO_ESC_2_4_10,      /* We've seen ESC $ 0x2A. */
+  ISO_ESC_2_4_11,      /* We've seen ESC $ 0x2B. */
+  ISO_ESC_2_4_12,      /* We've seen ESC $ 0x2C. */
+  ISO_ESC_2_4_13,      /* We've seen ESC $ 0x2D. */
+  ISO_ESC_2_4_14,      /* We've seen ESC $ 0x2E. */
+  ISO_ESC_2_4_15,      /* We've seen ESC $ 0x2F. */
+  ISO_ESC_5_11,                /* We've seen ESC [ or 0x9B.  This
+                          starts a directionality-control
+                          sequence.  The next character
+                          must be 0, 1, 2, or ]. */
+  ISO_ESC_5_11_0,      /* We've seen 0x9B 0.  The next
+                          character must be ]. */
+  ISO_ESC_5_11_1,      /* We've seen 0x9B 1.  The next
+                          character must be ]. */
+  ISO_ESC_5_11_2,      /* We've seen 0x9B 2.  The next
+                          character must be ]. */
+
+  /* Full sequences. */
+  ISO_ESC_START_COMPOSITE, /* Private usage for START COMPOSING */
+  ISO_ESC_END_COMPOSITE, /* Private usage for END COMPOSING */
+  ISO_ESC_SINGLE_SHIFT, /* We've seen a complete single-shift sequence. */
+  ISO_ESC_LOCKING_SHIFT,/* We've seen a complete locking-shift sequence. */
+  ISO_ESC_DESIGNATE,   /* We've seen a complete designation sequence. */
+  ISO_ESC_DIRECTIONALITY,/* We've seen a complete ISO6429 directionality
+                          sequence. */
+  ISO_ESC_LITERAL      /* We've seen a literal character ala
+                          escape-quoting. */
+};
+
+/* Macros to define code of control characters for ISO2022's functions.  */
+                       /* code */      /* function */
+#define ISO_CODE_LF    0x0A            /* line-feed */
+#define ISO_CODE_CR    0x0D            /* carriage-return */
+#define ISO_CODE_SO    0x0E            /* shift-out */
+#define ISO_CODE_SI    0x0F            /* shift-in */
+#define ISO_CODE_ESC   0x1B            /* escape */
+#define ISO_CODE_DEL   0x7F            /* delete */
+#define ISO_CODE_SS2   0x8E            /* single-shift-2 */
+#define ISO_CODE_SS3   0x8F            /* single-shift-3 */
+#define ISO_CODE_CSI   0x9B            /* control-sequence-introduce */
+
+/* Macros to access an encoding stream or decoding stream */
+
+#define CODING_STREAM_DECOMPOSE(str, flags, ch)        \
+do {                                           \
+  flags = (str)->flags;                                \
+  ch = (str)->ch;                              \
+} while (0)
+
+#define CODING_STREAM_COMPOSE(str, flags, ch)  \
+do {                                           \
+  (str)->flags = flags;                                \
+  (str)->ch = ch;                              \
+} while (0)
+
+
+/* For detecting the encoding of text */
+enum coding_category_type
+{
+  CODING_CATEGORY_SHIFT_JIS,
+  CODING_CATEGORY_ISO_7, /* ISO2022 system using only seven-bit bytes,
+                           no locking shift */
+  CODING_CATEGORY_ISO_8_DESIGNATE, /* ISO2022 system using eight-bit bytes,
+                                     no locking shift, no single shift,
+                                     using designation to switch charsets */
+  CODING_CATEGORY_ISO_8_1, /* ISO2022 system using eight-bit bytes,
+                             no locking shift, no designation sequences,
+                             one-dimension characters in the upper half. */
+  CODING_CATEGORY_ISO_8_2, /* ISO2022 system using eight-bit bytes,
+                             no locking shift, no designation sequences,
+                             two-dimension characters in the upper half. */
+  CODING_CATEGORY_ISO_LOCK_SHIFT, /* ISO2022 system using locking shift */
+  CODING_CATEGORY_BIG5,
+  CODING_CATEGORY_NO_CONVERSION
+};
+
+#define CODING_CATEGORY_LAST CODING_CATEGORY_NO_CONVERSION
+
+#define CODING_CATEGORY_SHIFT_JIS_MASK \
+  (1 << CODING_CATEGORY_SHIFT_JIS)
+#define CODING_CATEGORY_ISO_7_MASK \
+  (1 << CODING_CATEGORY_ISO_7)
+#define CODING_CATEGORY_ISO_8_DESIGNATE_MASK \
+  (1 << CODING_CATEGORY_ISO_8_DESIGNATE)
+#define CODING_CATEGORY_ISO_8_1_MASK \
+  (1 << CODING_CATEGORY_ISO_8_1)
+#define CODING_CATEGORY_ISO_8_2_MASK \
+  (1 << CODING_CATEGORY_ISO_8_2)
+#define CODING_CATEGORY_ISO_LOCK_SHIFT_MASK \
+  (1 << CODING_CATEGORY_ISO_LOCK_SHIFT)
+#define CODING_CATEGORY_BIG5_MASK \
+  (1 << CODING_CATEGORY_BIG5)
+#define CODING_CATEGORY_NO_CONVERSION_MASK \
+  (1 << CODING_CATEGORY_NO_CONVERSION)
+#define CODING_CATEGORY_NOT_FINISHED_MASK \
+  (1 << 30)
+
+/* Convert shift-JIS code (sj1, sj2) into internal string
+   representation (c1, c2). (The leading byte is assumed.) */
+
+#define DECODE_SJIS(sj1, sj2, c1, c2)                  \
+do {                                                   \
+  int I1 = sj1, I2 = sj2;                              \
+  if (I2 >= 0x9f)                                      \
+    c1 = (I1 << 1) - ((I1 >= 0xe0) ? 0xe0 : 0x60),     \
+    c2 = I2 + 2;                                       \
+  else                                                 \
+    c1 = (I1 << 1) - ((I1 >= 0xe0) ? 0xe1 : 0x61),     \
+    c2 = I2 + ((I2 >= 0x7f) ? 0x60 : 0x61);            \
+} while (0)
+
+/* Convert the internal string representation of a Shift-JIS character
+   (c1, c2) into Shift-JIS code (sj1, sj2).  The leading byte is
+   assumed. */
+
+#define ENCODE_SJIS(c1, c2, sj1, sj2)                  \
+do {                                                   \
+  int I1 = c1, I2 = c2;                                        \
+  if (I1 & 1)                                          \
+    sj1 = (I1 >> 1) + ((I1 < 0xdf) ? 0x31 : 0x71),     \
+    sj2 = I2 - ((I2 >= 0xe0) ? 0x60 : 0x61);           \
+  else                                                 \
+    sj1 = (I1 >> 1) + ((I1 < 0xdf) ? 0x30 : 0x70),     \
+    sj2 = I2 - 2;                                      \
+} while (0)
+
+Lisp_Object make_decoding_input_stream  (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_encoding_input_stream  (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_decoding_output_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object make_encoding_output_stream (Lstream *stream, Lisp_Object codesys);
+Lisp_Object decoding_stream_coding_system (Lstream *stream);
+Lisp_Object encoding_stream_coding_system (Lstream *stream);
+void set_decoding_stream_coding_system (Lstream *stream, Lisp_Object codesys);
+void set_encoding_stream_coding_system (Lstream *stream, Lisp_Object codesys);
+void determine_real_coding_system (Lstream *stream, Lisp_Object *codesys_in_out,
+                                  enum eol_type *eol_type_in_out);
+#endif /* _XEMACS_MULE_CODING_H_ */
diff --git a/src/mule-mcpath.c b/src/mule-mcpath.c
new file mode 100644 (file)
index 0000000..9e10b70
--- /dev/null
@@ -0,0 +1,306 @@
+/* Support for Non-ASCII Path Name
+   Copyright (C) 1985, 1986, 1992, 1993, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Mule 2.3.   Not in FSF. */
+
+/* mcpath.h should be included in config.h */
+#include <config.h>
+#include "lisp.h"
+
+#include "sysfile.h"
+#include "buffer.h"
+#include "mule.h"
+
+Lisp_Object Qpathname_coding_system = 0;
+
+static void
+mcpath_encode_code (struct Lisp_Coding_System *cp)
+{
+  Lisp_Object coding_system;
+
+  coding_system = Fsymbol_value (Qpathname_coding_system);
+
+  mule_encode_code (coding_system, cp);
+  CODE_CNTL (cp) |= CC_END;
+}
+
+static int
+mule_encode_path_1 (unsigned char *src, unsigned int srcsize,
+                   unsigned char *dst, unsigned int dstsize)
+{
+  struct Lisp_Coding_System code;
+
+  mcpath_encode_code (&code);
+  if (CODE_TYPE (&code) > MULE_AUTOCONV)
+    {
+      unsigned char *buf;
+
+                                       /* get_conversion_buffer () is not */
+                                       /* re-entrant. */
+      buf = (unsigned char *) alloca (MULE_ENCODE_BUF_SIZE (srcsize, &code));
+      if (buf)
+       {
+         int len;
+         Lisp_Object dummy = Qnil;
+
+         len = mule_encode (&code, src, buf, srcsize, &dummy);
+         if (!CODE_CHAR (&code) && len <= dstsize)
+           {
+             memcpy (dst, buf, len);
+             return len;
+           }
+       }
+    }
+  return -1;                           /* use original */
+}
+
+static unsigned char *
+mule_decode_path_1 (unsigned char *src, unsigned char *dst,
+                   unsigned int dstsize)
+{
+  struct Lisp_Coding_System code;
+
+  mcpath_encode_code (&code);
+  if (CODE_TYPE (&code) > MULE_AUTOCONV)
+    {
+      int len;
+      unsigned char *buf;
+
+      len = strlen (src) + 1;          /* + 1 for '\0' */
+
+                                       /* get_conversion_buffer () is not */
+                                       /* re-entrant. */
+      buf = (unsigned char *) alloca (MULE_DECODE_BUF_SIZE (len, &code));
+      if (buf)
+       {
+         CODE_CNTL (&code) |= CC_END;
+         len = mule_decode (&code, src, buf, len);
+         if (!CODE_CHAR (&code) && len <= dstsize)
+           {
+             memcpy (dst, buf, len);   /* len should include '\0' */
+             return dst;
+           }
+       }
+    }
+  return src;
+}
+
+static unsigned char *
+mule_decode_path (unsigned char *path, unsigned char ext_path[MC_MAXPATHLEN])
+{
+  return
+    (Qpathname_coding_system
+     ? mule_decode_path_1 (path, ext_path, MC_MAXPATHLEN)
+     : path);                          /* in case of before initialization */
+}
+
+static unsigned char *
+mule_encode_path (unsigned char *path, unsigned char *encode_buffer,
+                 unsigned int size)
+{
+  int len;
+
+  len = mule_encode_path_1 (path, strlen (path), encode_buffer, size);
+  if (len > 0)
+    path = encode_buffer;
+#ifdef MSDOS
+  /* convert the MSDOS style path delimiter to the UNIX style.  Note
+     that now the code is *internal*, so we can simply compare each
+     character with '\\'.  And this operation will alter the contents
+     of Lisp Object, PATH. */
+  {
+    unsigned char *p = path;
+
+    while (*p)
+      {
+       if (*p == '\\')
+         *p = '/';
+       p++;
+      }
+  }
+#endif /* MSDOS */
+  return path;
+}
+
+#if 0 /* example of how they do it (similar junk deleted) ... */
+
+int
+mc_creat (unsigned char *path, int mode)
+{
+  unsigned char buffer[MC_MAXPATHLEN];
+  return creat (mule_decode_path (path, buffer), mode);
+}
+
+int
+mc_readlink (unsigned char *path, unsigned char *buf, int size)
+{
+  unsigned char buffer[MC_MAXPATHLEN], buffer2[MAXPATHLEN];
+  int nread;
+
+  nread = readlink (mule_decode_path (path, buffer), buffer2, MAXPATHLEN);
+  if (nread > 0)
+    {
+      int len;
+      unsigned char *p;
+
+      len = mule_encode_path_1 (buffer2, nread, buffer, sizeof (buffer));
+      if (0 <= len && len <= size)
+       {
+         memcpy (buf, buffer, len);
+         return len;
+       }
+    }
+  return -1;
+}
+
+int
+mc_chdir (unsigned char *path)
+{
+  unsigned char buffer[MC_MAXPATHLEN];
+
+  path = mule_decode_path (path, buffer);
+
+#ifdef MSDOS
+  if ((path[0] != 0) && (path[1] == ':'))
+    {
+      int drive = (tolower (path[0]) - 'a');
+      if (getdisk () != drive)
+       setdisk (drive);
+    }
+
+  /* If path != "/" and path != "a:/" and path ends with slash, remove
+     it. */
+  {
+    int len = strlen (path);
+
+    if (strcmp (path + 1, ":/") && (len > 1) && (path[len - 1] == '/'))
+      {
+       if (path != buffer)     /* It is not good to modify original path. */
+         {
+           memcpy (buffer, path, len - 1); /* no need to copy last /. */
+           path = buffer;
+         }
+       path[len - 1] = 0;
+      }
+  }
+#endif /* MSDOS */
+
+  return chdir (path);
+}
+
+#ifdef MSDOS
+#ifndef HAVE_GETWD
+unsigned char *
+mc_getcwd (unsigned char *null, size_t size)
+{
+  unsigned char buffer[MAXPATHLEN];
+  unsigned char *path;
+
+  path = (unsigned char *) getcwd ((char *)buffer, MAXPATHLEN);
+  if (path)
+    {
+      /* here, shoule be (path == buffer). */
+      path = (unsigned char *) xmalloc (MC_MAXPATHLEN);        /* MSDOS */
+      if (path)
+       {
+         int len;
+         int buffer_length = strlen (buffer) + 1;
+
+         len = mule_encode_path_1 (buffer, buffer_length, path, MC_MAXPATHLEN);
+         if (len < 0)
+           {
+             /* conversion failed.  use value that is returned from system. */
+             memcpy (path, buffer, buffer_length);
+           }
+       }
+    }
+  return path;
+}
+#else /* HAVE_GETWD */
+unsigned char *
+mc_getwd (unsigned char path[])
+{
+  unsigned char *p;
+  p = getwd (path);
+  if (p)
+    {
+      unsigned char buffer[MC_MAXPATHLEN];
+      int len;
+      
+      len = mule_encode_path_1 (path, strlen (path) + 1, buffer, sizeof buffer);
+      if (len > 0)
+       {
+         memcpy (path, buffer, len);
+       }
+    }
+  return p;
+}
+#endif /* HAVE_GETWD */
+#endif /* MSDOS */
+
+/* In callproc.c, execvp() is called like this:
+ *     execvp (new_argv[0], new_argv);
+ * following implement depends this.
+ */
+#ifndef NO_MC_EXECVP
+void
+mc_execvp (unsigned char *path, unsigned char *argv[])
+{
+  unsigned char buffer[MC_MAXPATHLEN];
+  argv[0] = path = mule_decode_path (path, buffer);
+  execvp (path, argv);
+}
+#endif /* !NO_MC_EXECVP */
+
+static DIRENTRY mcpath_directory_entry;
+DIRENTRY *
+mc_readdir (DIR *d)
+{
+  SYSTEM_DIRENTRY *sp;
+  DIRENTRY *dp = &mcpath_directory_entry;
+
+  sp = readdir (d);
+  if (!sp) return 0;
+
+#ifndef MSDOS
+  dp->d_ino = sp->d_ino;
+#endif /* MSDOS */
+  {                            /* copy d_name with conversion. */
+    int len;
+
+    len = mule_encode_path_1 (sp->d_name, NAMLEN (sp),
+                             dp->d_name, sizeof (dp->d_name) - 1);
+    if (len < 0)
+      {
+       len = NAMLEN (sp);
+#ifdef MCPATH_ASSERT
+       assert (len < sizeof (dp->d_name));
+#endif
+       memcpy (dp->d_name, sp->d_name, len);
+      }
+    dp->d_name[len] = 0;
+  }
+  return dp;
+}
+
+#endif /* 0 */
+
diff --git a/src/mule-mcpath.h b/src/mule-mcpath.h
new file mode 100644 (file)
index 0000000..0033b62
--- /dev/null
@@ -0,0 +1,95 @@
+/* Support for Non-ASCII Path Name
+   Copyright (C) 1985, 1986, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995 Sun Microsystems, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Mule 2.3.  Not in FSF. */
+
+/* This part cannot be surround with #ifdef emacs, because it is needed */
+/* during generate xmakefile. */
+#ifndef MCPATH
+# define MCPATH
+#endif /* !MCPATH */
+
+/* not to confuse while compiling etc/*.c */
+#ifdef emacs
+#ifdef MCPATH
+#  ifndef _MCPATH_H                    /* enable to include twice */
+
+#if 1
+\f
+/* !!! This page is copied from dired.c except that DIRENTRY is
+   changed to SYSTEM_DIRENTRY.  Don't modify this page. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* The d_nameln member of a struct dirent includes the '\0' character
+   on some systems, but not on others.  What's worse, you can't tell
+   at compile-time which one it will be, since it really depends on
+   the sort of system providing the filesystem you're reading from,
+   not the system you are running on.  Paul Eggert
+   <eggert@bi.twinsun.com> says this occurs when Emacs is running on a
+   SunOS 4.1.2 host, reading a directory that is remote-mounted from a
+   Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
+
+   Since applying strlen to the name always works, we'll just do that.  */
+#define NAMLEN(p) strlen (p->d_name)
+
+#ifdef SYSV_SYSTEM_DIR
+
+#include <dirent.h>
+#define SYSTEM_DIRENTRY struct dirent
+
+#else /* not SYSV_SYSTEM_DIR */
+
+#ifdef NONSYSTEM_DIR_LIBRARY
+#include "ndir.h"
+#else /* not NONSYSTEM_DIR_LIBRARY */
+#ifdef MSDOS
+#include <dirent.h>
+#else
+#include <sys/dir.h>
+#endif
+#endif /* not NONSYSTEM_DIR_LIBRARY */
+
+#ifndef MSDOS
+#define SYSTEM_DIRENTRY struct direct
+
+extern DIR *opendir ();
+extern struct direct *readdir ();
+
+#endif /* not MSDOS */
+#endif /* not SYSV_SYSTEM_DIR */
+#endif
+\f
+                               /* maximum buffer size to do conversion. */
+#define MCPATH_BUFSIZ(s) (((s) * 3) + 256)
+#define MC_MAXPATHLEN MCPATH_BUFSIZ (MAXPATHLEN)
+
+#define DIRENTRY struct mcpath_direntry
+struct mcpath_direntry
+{
+                               /* emacs 19.28 uses d_ino and d_name. */
+#ifndef MSDOS
+  int d_ino;
+#endif /* not MSDOS */
+  unsigned char d_name [MCPATH_BUFSIZ (MAXNAMLEN) + 1];
+};
index 20f2c75..255d3fd 100644 (file)
@@ -51,14 +51,12 @@ Boston, MA 02111-1307, USA.  */
 
 #ifdef __CYGWIN32__
 #define stricmp strcasecmp
-#define FONTENUMPROC FONTENUMEXPROC
-#define ntmTm ntmentm
 #endif
 
 typedef struct colormap_t 
 {
-  CONST char *name;
-  CONST COLORREF colorref;
+  char *name;
+  COLORREF colorref;
 } colormap_t;
 
 /* Colors from X11R6 "XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp" */
@@ -723,58 +721,6 @@ static CONST colormap_t mswindows_X_color_map[] =
   {"LightGreen"                        , PALETTERGB (144, 238, 144) }
 };
 
-
-typedef struct fontmap_t 
-{
-  CONST char *name;
-  CONST int value;
-} fontmap_t;
-
-/* Default weight first, preferred names listed before synonyms */
-static CONST fontmap_t fontweight_map[] = 
-{
-  {"Regular"           , FW_REGULAR},  /* The standard font weight */
-  {"Thin"              , FW_THIN},
-  {"Extra Light"       , FW_EXTRALIGHT},
-  {"Ultra Light"       , FW_ULTRALIGHT},
-  {"Light"             , FW_LIGHT},
-  {"Normal"            , FW_NORMAL},
-  {"Medium"            , FW_MEDIUM},
-  {"Semi Bold"         , FW_SEMIBOLD},
-  {"Demi Bold"         , FW_DEMIBOLD},
-  {"Bold"              , FW_BOLD},     /* The standard bold font weight */
-  {"Extra Bold"                , FW_EXTRABOLD},
-  {"Ultra Bold"                , FW_ULTRABOLD},
-  {"Heavy"             , FW_HEAVY},
-  {"Black"             , FW_BLACK}
-};
-
-/* Default charset first, no synonyms allowed because these names are 
- * matched against the names reported by win32 by match_font() */
-static CONST fontmap_t charset_map[] = 
-{
-  {"Western"           , ANSI_CHARSET},
-  {"Symbol"            , SYMBOL_CHARSET},
-  {"Shift JIS"         , SHIFTJIS_CHARSET},    /* #### Name to be verified */
-  {"GB2312"            , GB2312_CHARSET},      /* #### Name to be verified */
-  {"Hanguel"           , HANGEUL_CHARSET},
-  {"Chinese Big 5"     , CHINESEBIG5_CHARSET}, /* #### Name to be verified */
-#if (WINVER >= 0x0400)
-  {"Johab"             , JOHAB_CHARSET},       /* #### Name to be verified */
-  {"Hebrew"            , HEBREW_CHARSET},      /* #### Name to be verified */
-  {"Arabic"            , ARABIC_CHARSET},      /* #### Name to be verified */
-  {"Greek"             , GREEK_CHARSET},
-  {"Turkish"           , TURKISH_CHARSET},
-  {"Vietnamese"                , VIETNAMESE_CHARSET},  /* #### Name to be verified */
-  {"Thai"              , THAI_CHARSET},        /* #### Name to be verified */
-  {"Central European"  , EASTEUROPE_CHARSET},
-  {"Cyrillic"          , RUSSIAN_CHARSET},
-  {"Mac"               , MAC_CHARSET},
-  {"Baltic"            , BALTIC_CHARSET},
-#endif
-  {"OEM/DOS"           , OEM_CHARSET}
-};
-
 \f
 /************************************************************************/
 /*                               helpers                                */
@@ -926,120 +872,6 @@ match_font (char *pattern1, char *pattern2, char *fontname)
   return 1;
 }
 
-
-
-
-\f
-/************************************************************************/
-/*                                 exports                              */
-/************************************************************************/
-
-struct font_enum_t
-{
-  HDC hdc;
-  struct device *d;
-};
-
-static int CALLBACK
-font_enum_callback_2 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, 
-                     int FontType, struct font_enum_t *font_enum)
-{
-  struct mswindows_font_enum *fontlist, **fonthead;
-  char fontname[MSW_FONTSIZE];
-  int i;
-
-  /*
-   * The enumerated font weights are not to be trusted because:
-   *  a) lpelfe->elfStyle is only filled in for TrueType fonts.
-   *  b) Not all Bold and Italic styles of all fonts (inluding some Vector,
-   *     Truetype and Raster fonts) are enumerated.
-   * I guess that fonts for which Bold and Italic styles are generated
-   * 'on-the-fly' are not enumerated. It would be overly restrictive to
-   * disallow Bold And Italic weights for these fonts, so we just leave
-   * weights unspecified. This means that we have to weed out duplicates of
-   * those fonts that do get enumerated with different weights.
-   */
-  if (FontType == 0 /*vector*/ || FontType == TRUETYPE_FONTTYPE)
-    /* Scalable, so leave pointsize blank */
-    sprintf (fontname, "%s::::", lpelfe->elfLogFont.lfFaceName);
-  else
-    /* Formula for pointsize->height from LOGFONT docs in Platform SDK */
-    sprintf (fontname, "%s::%d::", lpelfe->elfLogFont.lfFaceName,
-            MulDiv (lpntme->ntmTm.tmHeight - lpntme->ntmTm.tmInternalLeading,
-                    72, DEVICE_MSWINDOWS_LOGPIXELSY (font_enum->d)));
-
-  /*
-   * The enumerated font character set strings are not to be trusted because
-   * lpelfe->elfScript is returned in the host language and not in English.
-   * We can't know a priori the translations of "Western", "Central European"
-   * etc into the host language, so we must use English. The same argument
-   * applies to the font weight string when matching fonts.
-   */
-  for (i=0; i<countof (charset_map); i++)
-    if (lpelfe->elfLogFont.lfCharSet == charset_map[i].value)
-      {
-       strcat (fontname, charset_map[i].name);
-       break;
-      }
-  if (i==countof (charset_map))
-    strcpy (fontname, charset_map[0].name);
-
-  /* Check that the new font is not a duplicate */
-  fonthead = &DEVICE_MSWINDOWS_FONTLIST (font_enum->d);
-  fontlist = *fonthead;
-  while (fontlist)
-    if (!strcmp (fontname, fontlist->fontname))
-      return 1;                /* found a duplicate */
-    else
-      fontlist = fontlist->next;
-
-  /* Insert entry at head */
-  fontlist = *fonthead;
-  *fonthead = xmalloc (sizeof (struct mswindows_font_enum));
-  if (*fonthead == NULL)
-    {
-      *fonthead = fontlist;
-      return 0;
-    }
-  strcpy ((*fonthead)->fontname, fontname);
-  (*fonthead)->next = fontlist;
-  return 1;
-}
-
-static int CALLBACK
-font_enum_callback_1 (ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, 
-                     int FontType, struct font_enum_t *font_enum)
-{
-  /* This function gets called once per facename per character set.
-   * We call a second callback to enumerate the fonts in each facename */
-  return EnumFontFamiliesEx (font_enum->hdc, &lpelfe->elfLogFont,
-                            (FONTENUMPROC) font_enum_callback_2,
-                            (LPARAM) font_enum, 0);
-}
-
-/*
- * Enumerate the available fonts. Called by mswindows_init_device().
- * Fills in the device's device-type-specfic fontlist.
- */
-void
-mswindows_enumerate_fonts (struct device *d)
-{
-  HDC hdc = CreateCompatibleDC (NULL);
-  LOGFONT logfont;
-  struct font_enum_t font_enum;
-
-  assert (hdc!=NULL);
-  logfont.lfCharSet = DEFAULT_CHARSET;
-  logfont.lfFaceName[0] = '\0';
-  logfont.lfPitchAndFamily = DEFAULT_PITCH;
-  font_enum.hdc = hdc;
-  font_enum.d = d;
-  DEVICE_MSWINDOWS_FONTLIST (d) = NULL;
-  EnumFontFamiliesEx (hdc, &logfont, (FONTENUMPROC) font_enum_callback_1,
-                     (LPARAM) (&font_enum), 0);
-  DeleteDC (hdc);
-}
-
 \f
 /************************************************************************/
 /*                               methods                                */
@@ -1138,23 +970,19 @@ mswindows_finalize_font_instance (struct Lisp_Font_Instance *f)
     }
 }
 
-
 static int
 mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object name,
                                    Lisp_Object device, Error_behavior errb)
 {
   CONST char *extname;
   LOGFONT logfont;
-  int fields, i;
+  int fields;
   int pt;
   char fontname[LF_FACESIZE], weight[LF_FACESIZE], *style, points[8];
   char effects[LF_FACESIZE], charset[LF_FACESIZE];
   char *c;
-  HDC hdc;
-  HFONT holdfont;
-  TEXTMETRIC metrics;
-
-  extname = XSTRING_DATA (name);
+  
+  GET_C_STRING_CTEXT_DATA_ALLOCA (f->name, extname);
 
   /*
    * mswindows fonts look like:
@@ -1175,12 +1003,12 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
   /* This function is implemented in a fairly ad-hoc manner.
    * The general idea is to validate and canonicalize each of the above fields
    * at the same time as we build up the win32 LOGFONT structure. This enables
-   * us to use match_font() on a canonicalized font string to check the
+   * us to use math_font() on a canonicalized font string to check the
    * availability of the requested font */
 
-  if (fields < 0)
+  if (fields<0)
   {
-    maybe_signal_simple_error ("Invalid font", name, Qfont, errb);
+    maybe_signal_simple_error ("Invalid font", f->name, Qfont, errb);
     return (0);
   }
 
@@ -1191,13 +1019,13 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
   }
   else
   {
-    maybe_signal_simple_error ("Must specify a font name", name, Qfont, errb);
+    maybe_signal_simple_error ("Must specify a font name", f->name, Qfont, errb);
     return (0);
   }
 
   /* weight */
   if (fields < 2)
-    strcpy (weight, fontweight_map[0].name);
+    strcpy (weight, "Regular");
 
   /* Maybe split weight into weight and style */
   if ((c=strchr(weight, ' ')))
@@ -1208,26 +1036,37 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
   else
     style = NULL;
 
-  for (i=0; i<countof (fontweight_map); i++)
-    if (!stricmp (weight, fontweight_map[i].name))
-      {        
-       logfont.lfWeight = fontweight_map[i].value;
-       break;
-      }
-  if (i == countof (fontweight_map))   /* No matching weight */
+#define FROB(wgt)                              \
+  if (stricmp (weight, #wgt) == 0)             \
+    logfont.lfWeight = FW_##wgt
+
+  FROB (REGULAR);
+  else FROB (THIN);
+  else FROB (EXTRALIGHT);
+  else FROB (ULTRALIGHT);
+  else FROB (LIGHT);
+  else FROB (NORMAL);
+  else FROB (MEDIUM);
+  else FROB (SEMIBOLD);
+  else FROB (DEMIBOLD);
+  else FROB (BOLD);
+  else FROB (EXTRABOLD);
+  else FROB (ULTRABOLD);
+  else FROB (HEAVY);
+  else FROB (BLACK);
+  else if (!style)
     {
-      if (!style)
-       {
-         logfont.lfWeight = FW_REGULAR;
-         style = weight;       /* May have specified style without weight */
-       }
-      else
-       {
-         maybe_signal_simple_error ("Invalid font weight", name, Qfont, errb);
-         return (0);
-       }
+      logfont.lfWeight = FW_REGULAR;
+      style = weight;  /* May have specified style without weight */
+    }
+  else
+    {
+      maybe_signal_simple_error ("Invalid font weight", f->name, Qfont, errb);
+      return (0);
     }
 
+#undef FROB
+
   if (style)
     {
       /* #### what about oblique? */
@@ -1235,7 +1074,7 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
        logfont.lfItalic = TRUE;
       else
       {
-        maybe_signal_simple_error ("Invalid font weight or style", name, Qfont, errb);
+        maybe_signal_simple_error ("Invalid font weight or style", f->name, Qfont, errb);
        return (0);
       }
 
@@ -1250,12 +1089,12 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
     pt = 10;   /* #### Should we reject strings that don't specify a size? */
   else if ((pt=atoi(points)) == 0)
     {
-      maybe_signal_simple_error ("Invalid font pointsize", name, Qfont, errb);
+      maybe_signal_simple_error ("Invalid font pointsize", f->name, Qfont, errb);
       return (0);
     }
 
   /* Formula for pointsize->height from LOGFONT docs in MSVC5 Platform SDK */
-  logfont.lfHeight = -MulDiv(pt, DEVICE_MSWINDOWS_LOGPIXELSY (XDEVICE (device)), 72);
+  logfont.lfHeight = -MulDiv(pt, DEVICE_MSWINDOWS_LOGPIXELSY(XDEVICE (device)), 72);
   logfont.lfWidth = 0;
 
   /* Effects */
@@ -1280,7 +1119,8 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
        logfont.lfStrikeOut = TRUE;
       else
         {
-          maybe_signal_simple_error ("Invalid font effect", name, Qfont, errb);
+          maybe_signal_simple_error ("Invalid font effect", f->name,
+                                    Qfont, errb);
          return (0);
        }
 
@@ -1292,7 +1132,7 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
            logfont.lfStrikeOut = TRUE;
          else
            {
-             maybe_signal_simple_error ("Invalid font effect", name,
+             maybe_signal_simple_error ("Invalid font effect", f->name,
                                         Qfont, errb);
              return (0);
            }
@@ -1312,50 +1152,63 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
   else
     effects[0] = '\0';
 
-  /* Charset */
+#define FROB(cs)                               \
+  else if (stricmp (charset, #cs) == 0)                \
+    logfont.lfCharSet = cs##_CHARSET
+
+  /* Charset aliases. Hangeul = Hangul is defined in windows.h.
+     We do not use the name "russian", only "cyrillic", as it is
+     the common name of this charset, used in other languages
+     than Russian. */
+#define CYRILLIC_CHARSET RUSSIAN_CHARSET
+#define CENTRALEUROPEAN_CHARSET EASTEUROPE_CHARSET
+#define CENTRALEUROPEAN_CHARSET EASTEUROPE_CHARSET
+
   /* charset can be specified even if earlier fields havn't been */
-  if (fields < 5)
+  if ((fields < 5) && (c=strchr (extname, ':')) && (c=strchr (c+1, ':')) &&
+      (c=strchr (c+1, ':')) && (c=strchr (c+1, ':')))
     {
-      if ((c=strchr (extname, ':')) && (c=strchr (c+1, ':')) &&
-         (c=strchr (c+1, ':')) && (c=strchr (c+1, ':')))
-       {
-         strncpy (charset, c+1, LF_FACESIZE);
-         charset[LF_FACESIZE-1] = '\0';
-       }
-      else
-       strcpy (charset, charset_map[0].name);
+      strncpy (charset, c+1, LF_FACESIZE);
+      charset[LF_FACESIZE-1] = '\0';
     }
-
-  for (i=0; i<countof (charset_map); i++)
-    if (!stricmp (charset, charset_map[i].name))
-      {
-       logfont.lfCharSet = charset_map[i].value;
-       break;
-      }
-
-  if (i == countof (charset_map))      /* No matching charset */
+  else
+    charset[0] = '\0';
+         
+  if (charset[0] == '\0' || (stricmp (charset, "ansi") == 0) ||
+      (stricmp (charset, "western") == 0))
+    {
+      logfont.lfCharSet = ANSI_CHARSET;
+      strcpy (charset, "western");
+    }
+  FROB (SYMBOL);
+  FROB (SHIFTJIS);
+  FROB (GB2312);
+  FROB (HANGEUL);
+  FROB (CHINESEBIG5);
+  FROB (JOHAB);
+  FROB (HEBREW);
+  FROB (ARABIC);
+  FROB (GREEK);
+  FROB (TURKISH);
+  FROB (THAI);
+  FROB (EASTEUROPE);
+  FROB (CENTRALEUROPEAN);
+  FROB (CYRILLIC);
+  FROB (MAC);
+  FROB (BALTIC);
+  else if (stricmp (charset, "oem/dos") == 0)
+    logfont.lfCharSet = OEM_CHARSET;
+  else
     {
-      maybe_signal_simple_error ("Invalid charset", name, Qfont, errb);
+      maybe_signal_simple_error ("Invalid charset", f->name, Qfont, errb);
       return 0;
     }
 
-  /* Misc crud */
-  logfont.lfEscapement = logfont.lfOrientation = 0;
-#if 1
-  logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
-  logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
-  logfont.lfQuality = DEFAULT_QUALITY;
-#else
-  logfont.lfOutPrecision = OUT_STROKE_PRECIS;
-  logfont.lfClipPrecision = CLIP_STROKE_PRECIS;
-  logfont.lfQuality = PROOF_QUALITY;
-#endif
-  /* Default to monospaced if the specified fontname doesn't exist. */
-  logfont.lfPitchAndFamily = FF_MODERN;
+#undef FROB
 
   /* Windows will silently substitute a default font if the fontname 
    * specifies a non-existent font. So we check the font against the device's
-   * list of font patterns to make sure that at least one of them matches. */
+   * list of font patterns to make sure that at least one of them matches */
   {
     struct mswindows_font_enum *fontlist;
     char truename[MSW_FONTSIZE];
@@ -1370,37 +1223,58 @@ mswindows_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object na
       }
     if (!done)
       {
-       maybe_signal_simple_error ("No matching font", name, Qfont, errb);
+       maybe_signal_simple_error ("No matching font", f->name, Qfont, errb);
        return 0;
       }
   }
 
+  /* Misc crud */
+  logfont.lfEscapement = logfont.lfOrientation = 0;
+#if 1
+  logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
+  logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+  logfont.lfQuality = DEFAULT_QUALITY;
+#else
+  logfont.lfOutPrecision = OUT_STROKE_PRECIS;
+  logfont.lfClipPrecision = CLIP_STROKE_PRECIS;
+  logfont.lfQuality = PROOF_QUALITY;
+#endif
+  /* Default to monospaced if the specified fontname doesn't exist.
+   * The match_font calls above should mean that this can't happen. */
+  logfont.lfPitchAndFamily = FF_MODERN;
+
   if ((f->data = CreateFontIndirect(&logfont)) == NULL)
   {
-    maybe_signal_simple_error ("Couldn't create font", name, Qfont, errb);
+    maybe_signal_simple_error ("Couldn't create font", f->name, Qfont, errb);
     return 0;
   }
 
-  hdc = CreateCompatibleDC (NULL);
-  if (hdc)
-    {
-      holdfont = SelectObject(hdc, f->data);
-      if (holdfont)
-       {
-         GetTextMetrics (hdc, &metrics);
-         SelectObject(hdc, holdfont);
-         DeleteDC (hdc);
-         f->width = (unsigned short) metrics.tmAveCharWidth;
-         f->height = (unsigned short) metrics.tmHeight;
-         f->ascent = (unsigned short) metrics.tmAscent;
-         f->descent = (unsigned short) metrics.tmDescent;
-         f->proportional_p = (metrics.tmPitchAndFamily & TMPF_FIXED_PITCH);
-         return 1;
-       }
-      DeleteDC (hdc);
-    }
-  mswindows_finalize_font_instance (f);
-  maybe_signal_simple_error ("Couldn't map font", name, Qfont, errb);
+  {
+    HDC hdc;
+    HFONT holdfont;
+    TEXTMETRIC metrics;
+
+    hdc = CreateCompatibleDC (NULL);
+    if (hdc)
+      {
+       holdfont = SelectObject(hdc, f->data);
+       if (holdfont)
+         {
+           GetTextMetrics (hdc, &metrics);
+           SelectObject(hdc, holdfont);
+           DeleteDC (hdc);
+           f->width = (unsigned short) metrics.tmAveCharWidth;
+           f->height = (unsigned short) metrics.tmHeight;
+           f->ascent = (unsigned short) metrics.tmAscent;
+           f->descent = (unsigned short) metrics.tmDescent;
+           f->proportional_p = (metrics.tmPitchAndFamily & TMPF_FIXED_PITCH);
+           return 1;
+         }
+       DeleteDC (hdc);
+      }
+    mswindows_finalize_font_instance (f);
+    maybe_signal_simple_error ("Couldn't map font", f->name, Qfont, errb);
+  }
   return 0;
 }
 
diff --git a/src/pure.c b/src/pure.c
new file mode 100644 (file)
index 0000000..0d15775
--- /dev/null
@@ -0,0 +1,36 @@
+/* This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.30.  Split out of alloc.c. */
+
+#include <config.h>
+#include "lisp.h"
+#include "puresize.h"
+
+/* Moved from puresize.h to here so alloc.c does not get recompiled */
+
+# include <puresize-adjust.h>
+#define PURESIZE ((RAW_PURESIZE) + (PURESIZE_ADJUSTMENT))
+
+size_t
+get_PURESIZE (void)
+{
+  return PURESIZE;
+}
+
+/* Force linker to put it into data space! */
+EMACS_INT pure[PURESIZE / sizeof (EMACS_INT)] = { (EMACS_INT) 0};
diff --git a/src/puresize.h b/src/puresize.h
new file mode 100644 (file)
index 0000000..0e4bc33
--- /dev/null
@@ -0,0 +1,169 @@
+/* Definition of PURESIZE.
+   Copyright (C) 1986, 1988, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996 Ben Wing.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+#ifndef PURESIZE_H
+#define PURESIZE_H
+
+/* If RAW_PURESIZE is already defined then the user overrode it at
+   configure time. */
+#ifndef RAW_PURESIZE
+
+/* Basic amount of purespace to use, in the absence of extra
+   things configured in. */
+
+
+/* This computation is Barbra Streisand, BS
+#if (LONGBITS == 64)
+# define BASE_PURESIZE 938000
+#else
+# define BASE_PURESIZE 563000
+#endif
+*/
+
+#define BASE_PURESIZE 1400000
+
+/* If any particular systems need to change the base puresize, they
+   should define SYSTEM_PURESIZE_EXTRA.  Note that this can be
+   negative as well as positive.
+
+   Do NOT define PURESIZE or any other values.  This allows the
+   other values to shift while still keeping things in sync. */
+
+#ifndef SYSTEM_PURESIZE_EXTRA
+# define SYSTEM_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for menubars. */
+
+#ifdef HAVE_DIALOGS
+# if (LONGBITS == 64)
+#  define DIALOG_PURESIZE_EXTRA 43000
+# else
+#  define DIALOG_PURESIZE_EXTRA 1800
+# endif
+#else
+# define DIALOG_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_MENUBARS
+# if (LONGBITS == 64)
+#  define MENUBAR_PURESIZE_EXTRA 43000
+# else
+#  define MENUBAR_PURESIZE_EXTRA 36000
+# endif
+#else
+# define MENUBAR_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_SCROLLBARS
+# if (LONGBITS == 64)
+#  define SCROLLBAR_PURESIZE_EXTRA 4000
+# else
+#  define SCROLLBAR_PURESIZE_EXTRA 1800
+# endif
+#else
+# define SCROLLBAR_PURESIZE_EXTRA 0
+#endif
+
+#ifdef HAVE_TOOLBARS
+# if (LONGBITS == 64)
+#  define TOOLBAR_PURESIZE_EXTRA 4000
+# else
+#  define TOOLBAR_PURESIZE_EXTRA 8400
+# endif
+#else
+# define TOOLBAR_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for X11, separate from menubars
+   and scrollbars. */
+
+#ifdef HAVE_X_WINDOWS
+# if (LONGBITS == 64)
+#  define X11_PURESIZE_EXTRA 95000
+# else
+#  define X11_PURESIZE_EXTRA 68000
+# endif
+#else
+# define X11_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Mule. */
+
+#ifdef MULE
+#ifdef HAVE_CANNA
+# define MULE_PURESIZE_CANNA 5000
+#else
+# define MULE_PURESIZE_CANNA 0
+#endif
+#ifdef HAVE_WNN
+# define MULE_PURESIZE_WNN 5000
+#else
+# define MULE_PURESIZE_WNN 0
+#endif
+# if (LONGBITS == 64)
+#  define MULE_PURESIZE_EXTRA 99000+MULE_PURESIZE_CANNA+MULE_PURESIZE_WNN
+# else
+#  define MULE_PURESIZE_EXTRA 78000+MULE_PURESIZE_CANNA+MULE_PURESIZE_WNN
+# endif
+#else
+# define MULE_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Tooltalk. */
+
+#ifdef TOOLTALK
+# if (LONGBITS == 64)
+#  define TOOLTALK_PURESIZE_EXTRA 100000
+# else
+#  define TOOLTALK_PURESIZE_EXTRA 8300
+# endif
+#else
+# define TOOLTALK_PURESIZE_EXTRA 0
+#endif
+
+/* Extra amount of purespace needed for Sunpro builds. */
+
+#ifdef SUNPRO
+#define SUNPRO_PURESIZE_EXTRA 95000
+#else
+# define SUNPRO_PURESIZE_EXTRA 0
+#endif
+
+#define RAW_PURESIZE ((BASE_PURESIZE) +                                        \
+                     (DIALOG_PURESIZE_EXTRA) +                         \
+                     (MENUBAR_PURESIZE_EXTRA) +                        \
+                     (SCROLLBAR_PURESIZE_EXTRA) +                      \
+                     (TOOLBAR_PURESIZE_EXTRA) +                        \
+                     (X11_PURESIZE_EXTRA) +                            \
+                     (SYSTEM_PURESIZE_EXTRA) +                         \
+                     (MULE_PURESIZE_EXTRA) +                           \
+                     (TOOLTALK_PURESIZE_EXTRA) +                       \
+                     (SUNPRO_PURESIZE_EXTRA))
+
+#endif /* !RAW_PURESIZE */
+
+size_t get_PURESIZE (void);
+extern EMACS_INT pure[];
+
+#endif /* PURESIZE_H */
index 16bb75a..b6247a5 100644 (file)
@@ -693,18 +693,8 @@ x_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg,
       mask |= GCBackground;
     }
 
-  /* This special case comes from a request to draw text with a face which has
-     the dim property. We'll use a stippled foreground GC. */
-  if (EQ (bg_pmap, Qdim))
-    {
-      assert (DEVICE_X_GRAY_PIXMAP (d) != None);
-
-      gcv.fill_style = FillStippled;
-      gcv.stipple = DEVICE_X_GRAY_PIXMAP (d);
-      mask |= (GCFillStyle | GCStipple);
-    }
-  else  if (IMAGE_INSTANCEP (bg_pmap)
-           && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
+  if (IMAGE_INSTANCEP (bg_pmap)
+      && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (bg_pmap)))
     {
       if (XIMAGE_INSTANCE_PIXMAP_DEPTH (bg_pmap) == 0)
        {
@@ -925,18 +915,6 @@ x_output_string (struct window *w, struct display_line *dl,
       if (cursor && cursor_cachel && focus && NILP (bar_cursor_value))
        gc = x_get_gc (d, font, cursor_cachel->foreground,
                       cursor_cachel->background, Qnil, Qnil);
-      else if (cachel->dim)
-       {
-         /* Ensure the gray bitmap exists */
-         if (DEVICE_X_GRAY_PIXMAP (d) == None)
-           DEVICE_X_GRAY_PIXMAP (d) = 
-             XCreateBitmapFromData (dpy, x_win, (char *)gray_bits,
-                                    gray_width, gray_height);
-
-         /* Request a GC with the gray stipple pixmap to draw dimmed text */
-         gc = x_get_gc (d, font, cachel->foreground, cachel->background,
-                        Qdim, Qnil);
-       }
       else
        gc = x_get_gc (d, font, cachel->foreground, cachel->background,
                       Qnil, Qnil);
index 9ae8b46..895f520 100644 (file)
@@ -5066,10 +5066,7 @@ redisplay_window (Lisp_Object window, int skip_selected)
          temporary change to the echo area. */
       && !(MINI_WINDOW_P (w) && f->buffers_changed)
       && !f->frame_changed
-      && !truncation_changed
-      /* check whether start is really at the begining of a line  GE */
-      && (!w->start_at_line_beg || beginning_of_line_p (b, startp))
-      )
+      && !truncation_changed)
     {
       /* Check if the cursor has actually moved. */
       if (EQ (Fmarker_buffer (w->last_point[CURRENT_DISP]), w->buffer)
index b8e9b25..1b68465 100644 (file)
@@ -4857,16 +4857,8 @@ re_match_2_internal (struct re_pattern_buffer *bufp, CONST char *string1,
                   highest_active_reg = NO_HIGHEST_ACTIVE_REG;
                 }
               else
-               {
-                 highest_active_reg = r;
-
-                 /* 98/9/21 jhod:  We've also gotta set lowest_active_reg, don't we? */
-                 r = 1;
-                 while (r < highest_active_reg && !IS_ACTIVE(reg_info[r]))
-                   r++;
-                 lowest_active_reg = r;
-               }
-           }
+                highest_active_reg = r;
+            }
 
           /* If just failed to match something this time around with a
              group that's operated on by a repetition operator, try to
diff --git a/src/s/msdos.h b/src/s/msdos.h
new file mode 100644 (file)
index 0000000..875083c
--- /dev/null
@@ -0,0 +1,223 @@
+/* System description file for MS-DOS
+
+   Copyright (C) 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: FSF 19.31. */
+
+/* Note: lots of stuff here was taken from s-msdos.h in demacs. */
+
+
+/*
+ *     Define symbols to identify the version of Unix this is.
+ *     Define all the symbols that apply correctly.
+ */
+
+/* #define UNIPLUS */
+/* #define USG5 */
+/* #define USG */
+/* #define HPUX */
+/* #define UMAX */
+/* #define BSD4_1 */
+/* #define BSD4_2 */
+/* #define BSD4_3 */
+/* #define BSD */
+#ifndef MSDOS
+#define MSDOS
+#endif
+
+#ifdef __GO32__
+#ifndef __DJGPP__
+#define __DJGPP__ 1    /* V2 defines __DJGPP__ == 2 */
+#endif
+#else
+You lose; /* Emacs for DOS must be compiled with DJGPP */
+#endif
+
+#define DOS_NT /* MSDOS or WINDOWSNT */
+#undef BSD
+
+/* SYSTEM_TYPE should indicate the kind of system you are using.
+ It sets the Lisp variable system-type.  */
+
+#define SYSTEM_TYPE "ms-dos"
+
+#define SYMS_SYSTEM syms_of_dosfns();syms_of_msdos()
+
+/* Letter to use in finding device name of first pty,
+  if system supports pty's.  'a' means it is /dev/ptya0  */
+
+/* #define FIRST_PTY_LETTER 'a' */
+
+/*
+ *     Define HAVE_PTYS if the system supports pty devices.
+ */
+
+/* #define HAVE_PTYS */
+
+/* MSDOS has dirent.h but doesn't behave otherwise like the SYSV
+   directory functions.  We have special tests for this in
+   sysdir.h. */
+
+#undef SYSV_SYSTEM_DIR
+
+/* Define this is the compiler understands `volatile'.  */
+#define HAVE_VOLATILE
+
+#define NO_SUBPROCESSES
+
+/* If your system uses COFF (Common Object File Format) then define the
+   preprocessor symbol "COFF". */
+
+#define COFF
+
+/* define MAIL_USE_FLOCK if the mailer uses flock
+   to interlock access to /usr/spool/mail/$USER.
+   The alternative is that a lock file named
+   /usr/spool/mail/$USER.lock.  */
+
+/* #define MAIL_USE_FLOCK */
+
+/* Here, on a separate page, add any special hacks needed
+   to make Emacs work on this system.  For example,
+   you might define certain system call names that don't
+   exist on your system, or that do different things on
+   your system and must be used only through an encapsulation
+   (Which you should place, by convention, in sysdep.c).  */
+\f
+/* 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.  */
+
+#define _setjmp setjmp
+#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
+#endif
+#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
+
+/* command.com does not understand `...` so we define this.  */
+#define LIB_GCC "-Lgcc"
+#define DONT_NEED_ENVIRON
+#define SEPCHAR ';'
+
+#define NULL_DEVICE "nul"
+#define EXEC_SUFFIXES ".exe:.com:.bat:"
+
+#if __DJGPP__ < 2
+#define O_RDONLY        0x0001
+#define O_WRONLY        0x0002
+#define O_RDWR          0x0004
+#define O_CREAT         0x0100
+#define O_TRUNC         0x0200
+#define O_EXCL          0x0400
+#define O_APPEND        0x0800
+#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:  */
+#define INTERNAL_TERMINAL "pc|bios|IBM PC with colour display:\
+:co#80:li#25:km:ms:cm=<CM>:cl=<CL>:ce=<CE>:"
+
+/* 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 */
+#define DEVICE_SEP ':'
+
+/* We'll support either convention on MSDOG.  */
+#define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\')
+#define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_))
+
+/* Call init_gettimeofday when TZ changes.  */
+#if __DJGPP__ < 2
+#define LOCALTIME_CACHE
+#define tzset init_gettimeofday
+#endif
+
+/* bcopy under djgpp is quite safe */
+#define GAP_USE_BCOPY
+#define BCOPY_UPWARD_SAFE 1
+#define BCOPY_DOWNWARD_SAFE 1
+
+/* Mode line description of a buffer's type.  */
+#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.  */
+#define HAVE_FACES
+
+/* Define one of these for easier conditionals.  */
+#ifdef HAVE_X_WINDOWS
+/* We need a little extra space, see ../../lisp/loadup.el */
+#define SYSTEM_PURESIZE_EXTRA 15000
+#define HAVE_X11R5
+#define LIBX11_SYSTEM "-lxext -lsys"
+#else
+/* We need a little extra space, see ../../lisp/loadup.el */
+#define SYSTEM_PURESIZE_EXTRA 85000
+#endif
diff --git a/src/s/windows95.h b/src/s/windows95.h
new file mode 100644 (file)
index 0000000..a6de39f
--- /dev/null
@@ -0,0 +1,7 @@
+/* Synched up with: FSF 19.31. */
+
+/* System description file for Windows 95.  */
+
+#include "windowsnt.h"
+
+#define WINDOWS95
diff --git a/src/xselect.c b/src/xselect.c
new file mode 100644 (file)
index 0000000..b974d25
--- /dev/null
@@ -0,0 +1,2160 @@
+/* X Selection processing for XEmacs
+   Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+
+This file is part of XEmacs.
+
+XEmacs 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.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not synched with FSF. */
+
+/* Rewritten by jwz */
+
+#include <config.h>
+#include "lisp.h"
+
+#include "buffer.h"
+#include "console-x.h"
+#include "objects-x.h"
+
+#include "frame.h"
+#include "opaque.h"
+#include "systime.h"
+
+int lisp_to_time (Lisp_Object, time_t *);
+Lisp_Object time_to_lisp (time_t);
+
+#ifdef LWLIB_USES_MOTIF
+# define MOTIF_CLIPBOARDS
+#endif
+
+#ifdef MOTIF_CLIPBOARDS
+# include <Xm/CutPaste.h>
+static void hack_motif_clipboard_selection (Atom selection_atom,
+                                           Lisp_Object selection_value,
+                                           Time thyme, Display *display,
+                                           Window selecting_window,
+                                           Bool owned_p);
+#endif
+
+#define CUT_BUFFER_SUPPORT
+
+Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
+  QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
+  QATOM_PAIR, QCOMPOUND_TEXT;
+
+#ifdef CUT_BUFFER_SUPPORT
+Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3,
+  QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7;
+#endif
+
+Lisp_Object Vx_lost_selection_hooks;
+Lisp_Object Vx_sent_selection_hooks;
+
+/* If this is a smaller number than the max-request-size of the display,
+   emacs will use INCR selection transfer when the selection is larger
+   than this.  The max-request-size is usually around 64k, so if you want
+   emacs to use incremental selection transfers when the selection is
+   smaller than that, set this.  I added this mostly for debugging the
+   incremental transfer stuff, but it might improve server performance.
+ */
+#define MAX_SELECTION_QUANTUM 0xFFFFFF
+
+#define SELECTION_QUANTUM(dpy) ((XMaxRequestSize (dpy) << 2) - 100)
+
+/* This is an association list whose elements are of the form
+     ( selection-name selection-value selection-timestamp )
+   selection-name is a lisp symbol, whose name is the name of an X Atom.
+   selection-value is the value that emacs owns for that selection.
+     It may be any kind of Lisp object.
+   selection-timestamp is the time at which emacs began owning this selection,
+     as a cons of two 16-bit numbers (making a 32 bit time).
+   If there is an entry in this alist, then it can be assumed that emacs owns
+    that selection.
+   The only (eq) parts of this list that are visible from elisp are the
+    selection-values.
+ */
+Lisp_Object Vselection_alist;
+
+/* This is an alist whose CARs are selection-types (whose names are the same
+   as the names of X Atoms) and whose CDRs are the names of Lisp functions to
+   call to convert the given Emacs selection value to a string representing
+   the given selection type.  This is for elisp-level extension of the emacs
+   selection handling.
+ */
+Lisp_Object Vselection_converter_alist;
+
+/* "Selection owner couldn't convert selection" */
+Lisp_Object Qselection_conversion_error;
+
+/* If the selection owner takes too long to reply to a selection request,
+   we give up on it.  This is in seconds (0 = no timeout).
+ */
+int x_selection_timeout;
+
+\f
+/* Utility functions */
+
+static void lisp_data_to_selection_data (struct device *,
+                                        Lisp_Object obj,
+                                        unsigned char **data_ret,
+                                        Atom *type_ret,
+                                        unsigned int *size_ret,
+                                        int *format_ret);
+static Lisp_Object selection_data_to_lisp_data (struct device *,
+                                               unsigned char *data,
+                                               size_t size,
+                                               Atom type,
+                                               int format);
+static Lisp_Object x_get_window_property_as_lisp_data (Display *,
+                                                      Window,
+                                                      Atom property,
+                                                      Lisp_Object target_type,
+                                                      Atom selection_atom);
+
+static int expect_property_change (Display *, Window, Atom prop, int state);
+static void wait_for_property_change (long);
+static void unexpect_property_change (int);
+static int waiting_for_other_props_on_window (Display *, Window);
+
+/* This converts a Lisp symbol to a server Atom, avoiding a server
+   roundtrip whenever possible.
+ */
+static Atom
+symbol_to_x_atom (struct device *d, Lisp_Object sym, int only_if_exists)
+{
+  Display *display = DEVICE_X_DISPLAY (d);
+
+  if (NILP (sym))              return XA_PRIMARY;
+  if (EQ (sym, Qt))            return XA_SECONDARY;
+  if (EQ (sym, QPRIMARY))      return XA_PRIMARY;
+  if (EQ (sym, QSECONDARY))    return XA_SECONDARY;
+  if (EQ (sym, QSTRING))       return XA_STRING;
+  if (EQ (sym, QINTEGER))      return XA_INTEGER;
+  if (EQ (sym, QATOM))         return XA_ATOM;
+  if (EQ (sym, QCLIPBOARD))    return DEVICE_XATOM_CLIPBOARD (d);
+  if (EQ (sym, QTIMESTAMP))    return DEVICE_XATOM_TIMESTAMP (d);
+  if (EQ (sym, QTEXT))         return DEVICE_XATOM_TEXT      (d);
+  if (EQ (sym, QDELETE))       return DEVICE_XATOM_DELETE    (d);
+  if (EQ (sym, QMULTIPLE))     return DEVICE_XATOM_MULTIPLE  (d);
+  if (EQ (sym, QINCR))         return DEVICE_XATOM_INCR      (d);
+  if (EQ (sym, QEMACS_TMP))    return DEVICE_XATOM_EMACS_TMP (d);
+  if (EQ (sym, QTARGETS))      return DEVICE_XATOM_TARGETS   (d);
+  if (EQ (sym, QNULL))         return DEVICE_XATOM_NULL      (d);
+  if (EQ (sym, QATOM_PAIR))    return DEVICE_XATOM_ATOM_PAIR (d);
+  if (EQ (sym, QCOMPOUND_TEXT)) return DEVICE_XATOM_COMPOUND_TEXT (d);
+
+#ifdef CUT_BUFFER_SUPPORT
+  if (EQ (sym, QCUT_BUFFER0))  return XA_CUT_BUFFER0;
+  if (EQ (sym, QCUT_BUFFER1))  return XA_CUT_BUFFER1;
+  if (EQ (sym, QCUT_BUFFER2))  return XA_CUT_BUFFER2;
+  if (EQ (sym, QCUT_BUFFER3))  return XA_CUT_BUFFER3;
+  if (EQ (sym, QCUT_BUFFER4))  return XA_CUT_BUFFER4;
+  if (EQ (sym, QCUT_BUFFER5))  return XA_CUT_BUFFER5;
+  if (EQ (sym, QCUT_BUFFER6))  return XA_CUT_BUFFER6;
+  if (EQ (sym, QCUT_BUFFER7))  return XA_CUT_BUFFER7;
+#endif /* CUT_BUFFER_SUPPORT */
+
+  {
+    CONST char *nameext;
+    GET_C_STRING_CTEXT_DATA_ALLOCA (Fsymbol_name (sym), nameext);
+    return XInternAtom (display, nameext, only_if_exists ? True : False);
+  }
+}
+
+
+/* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
+   and calls to intern whenever possible.
+ */
+static Lisp_Object
+x_atom_to_symbol (struct device *d, Atom atom)
+{
+  Display *display = DEVICE_X_DISPLAY (d);
+
+  if (! atom) return Qnil;
+  if (atom == XA_PRIMARY)      return QPRIMARY;
+  if (atom == XA_SECONDARY)    return QSECONDARY;
+  if (atom == XA_STRING)       return QSTRING;
+  if (atom == XA_INTEGER)      return QINTEGER;
+  if (atom == XA_ATOM)         return QATOM;
+  if (atom == DEVICE_XATOM_CLIPBOARD (d)) return QCLIPBOARD;
+  if (atom == DEVICE_XATOM_TIMESTAMP (d)) return QTIMESTAMP;
+  if (atom == DEVICE_XATOM_TEXT      (d)) return QTEXT;
+  if (atom == DEVICE_XATOM_DELETE    (d)) return QDELETE;
+  if (atom == DEVICE_XATOM_MULTIPLE  (d)) return QMULTIPLE;
+  if (atom == DEVICE_XATOM_INCR      (d)) return QINCR;
+  if (atom == DEVICE_XATOM_EMACS_TMP (d)) return QEMACS_TMP;
+  if (atom == DEVICE_XATOM_TARGETS   (d)) return QTARGETS;
+  if (atom == DEVICE_XATOM_NULL      (d)) return QNULL;
+  if (atom == DEVICE_XATOM_ATOM_PAIR (d)) return QATOM_PAIR;
+  if (atom == DEVICE_XATOM_COMPOUND_TEXT (d)) return QCOMPOUND_TEXT;
+
+#ifdef CUT_BUFFER_SUPPORT
+  if (atom == XA_CUT_BUFFER0)  return QCUT_BUFFER0;
+  if (atom == XA_CUT_BUFFER1)  return QCUT_BUFFER1;
+  if (atom == XA_CUT_BUFFER2)  return QCUT_BUFFER2;
+  if (atom == XA_CUT_BUFFER3)  return QCUT_BUFFER3;
+  if (atom == XA_CUT_BUFFER4)  return QCUT_BUFFER4;
+  if (atom == XA_CUT_BUFFER5)  return QCUT_BUFFER5;
+  if (atom == XA_CUT_BUFFER6)  return QCUT_BUFFER6;
+  if (atom == XA_CUT_BUFFER7)  return QCUT_BUFFER7;
+#endif
+
+  {
+    Lisp_Object newsym;
+    CONST Bufbyte *intstr;
+    char *str = XGetAtomName (display, atom);
+
+    if (! str) return Qnil;
+
+    GET_C_CHARPTR_INT_CTEXT_DATA_ALLOCA (str, intstr);
+    newsym = intern ((char *) intstr);
+    XFree (str);
+    return newsym;
+  }
+}
+
+\f
+/* Do protocol to assert ourself as a selection owner.
+   Update the Vselection_alist so that we can reply to later requests for
+   our selection.
+ */
+static void
+x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value)
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  struct frame *sel_frame = selected_frame ();
+  Window selecting_window = XtWindow (FRAME_X_TEXT_WIDGET (sel_frame));
+  /* Use the time of the last-read mouse or keyboard event.
+     For selection purposes, we use this as a sleazy way of knowing what the
+     current time is in server-time.  This assumes that the most recently read
+     mouse or keyboard event has something to do with the assertion of the
+     selection, which is probably true.
+     */
+  Time thyme = DEVICE_X_MOUSE_TIMESTAMP (d);
+  Atom selection_atom;
+
+  CHECK_SYMBOL (selection_name);
+  selection_atom = symbol_to_x_atom (d, selection_name, 0);
+
+  XSetSelectionOwner (display, selection_atom, selecting_window, thyme);
+
+  /* Now update the local cache */
+  {
+    /* We do NOT use time_to_lisp() here any more, like we used to.
+       That assumed equivalence of time_t and Time, which is not
+       necessarily the case (e.g. under OSF on the Alphas, where
+       Time is a 64-bit quantity and time_t is a 32-bit quantity).
+
+       Opaque pointers are the clean way to go here.
+     */
+    Lisp_Object selection_time = make_opaque (sizeof (thyme), (void *) &thyme);
+    Lisp_Object selection_data = list3 (selection_name,
+                                       selection_value,
+                                       selection_time);
+    Lisp_Object prev_value = assq_no_quit (selection_name, Vselection_alist);
+    Vselection_alist = Fcons (selection_data, Vselection_alist);
+
+    /* If we already owned the selection, remove the old selection data.
+       Perhaps we should destructively modify it instead.
+       Don't use Fdelq() as that may QUIT;.
+     */
+    if (!NILP (prev_value))
+      {
+       Lisp_Object rest;       /* we know it's not the CAR, so it's easy. */
+       for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
+         if (EQ (prev_value, Fcar (XCDR (rest))))
+           {
+             XCDR (rest) = Fcdr (XCDR (rest));
+             break;
+           }
+      }
+#ifdef MOTIF_CLIPBOARDS
+    hack_motif_clipboard_selection (selection_atom, selection_value,
+                                   thyme, display, selecting_window,
+                                   !NILP (prev_value));
+#endif
+  }
+}
+
+
+#ifdef MOTIF_CLIPBOARDS /* Bend over baby.  Take it and like it. */
+
+# ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+static void motif_clipboard_cb ();
+# endif
+
+static void
+hack_motif_clipboard_selection (Atom selection_atom,
+                               Lisp_Object selection_value,
+                               Time thyme,
+                               Display *display,
+                               Window selecting_window,
+                               Bool owned_p)
+{
+  struct device *d = get_device_from_display (display);
+  /* Those Motif wankers can't be bothered to follow the ICCCM, and do
+     their own non-Xlib non-Xt clipboard processing.  So we have to do
+     this so that linked-in Motif widgets don't get themselves wedged.
+   */
+  if (selection_atom == DEVICE_XATOM_CLIPBOARD (d)
+      && STRINGP (selection_value)
+
+      /* If we already own the clipboard, don't own it again in the Motif
+        way.  This might lose in some subtle way, since the timestamp won't
+        be current, but owning the selection on the Motif way does a
+        SHITLOAD of X protocol, and it makes killing text be incredibly
+        slow when using an X terminal.  ARRRRGGGHHH!!!!
+       */
+      /* No, this is no good, because then Motif text fields don't bother
+        to look up the new value, and you can't Copy from a buffer, Paste
+        into a text field, then Copy something else from the buffer and
+        paste it into the text field -- it pastes the first thing again. */
+/*      && !owned_p */
+      )
+    {
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+      Widget widget = FRAME_X_TEXT_WIDGET (selected_frame());
+#endif
+      long itemid;
+#if XmVersion >= 1002
+      long dataid;
+#else
+      int dataid;      /* 1.2 wants long, but 1.1.5 wants int... */
+#endif
+      XmString fmh;
+      String encoding = "STRING";
+      CONST Extbyte *data  = XSTRING_DATA (selection_value);
+      Extcount bytes = XSTRING_LENGTH (selection_value);
+
+#ifdef MULE
+      {
+       enum { ASCII, LATIN_1, WORLD } chartypes = ASCII;
+       CONST Bufbyte *ptr = data, *end = ptr + bytes;
+       /* Optimize for the common ASCII case */
+       while (ptr <= end)
+         {
+           if (BYTE_ASCII_P (*ptr))
+             {
+               ptr++;
+               continue;
+             }
+
+           if ((*ptr) == LEADING_BYTE_LATIN_ISO8859_1 ||
+               (*ptr) == LEADING_BYTE_CONTROL_1)
+             {
+               chartypes = LATIN_1;
+               ptr += 2;
+               continue;
+             }
+
+           chartypes = WORLD;
+           break;
+         }
+
+       if (chartypes == LATIN_1)
+         GET_STRING_BINARY_DATA_ALLOCA (selection_value, data, bytes);
+       else if (chartypes == WORLD)
+         {
+           GET_STRING_CTEXT_DATA_ALLOCA (selection_value, data, bytes);
+           encoding = "COMPOUND_TEXT";
+         }
+      }
+#endif /* MULE */
+
+      fmh = XmStringCreateLtoR ("Clipboard", XmSTRING_DEFAULT_CHARSET);
+      while (ClipboardSuccess !=
+            XmClipboardStartCopy (display, selecting_window, fmh, thyme,
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+                                  widget, motif_clipboard_cb,
+#else
+                                  0, NULL,
+#endif
+                                  &itemid))
+       ;
+      XmStringFree (fmh);
+      while (ClipboardSuccess !=
+            XmClipboardCopy (display, selecting_window, itemid, encoding,
+#ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+                             /* O'Reilly examples say size can be 0,
+                                but this clearly is not the case. */
+                             0, bytes, (int) selecting_window, /* private id */
+#else /* !MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+                             (XtPointer) data, bytes, 0,
+#endif /* !MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+                             &dataid))
+       ;
+      while (ClipboardSuccess !=
+            XmClipboardEndCopy (display, selecting_window, itemid))
+       ;
+    }
+}
+
+# ifdef MOTIF_INCREMENTAL_CLIPBOARDS_WORK
+/* I tried to treat the clipboard like a real selection, and not send
+   the data until it was requested, but it looks like that just doesn't
+   work at all unless the selection owner and requestor are in different
+   processes.  From reading the Motif source, it looks like they never
+   even considered having two widgets in the same application transfer
+   data between each other using "by-name" clipboard values.  What a
+   bunch of fuckups.
+ */
+static void
+motif_clipboard_cb (Widget widget, int *data_id, int *private_id, int *reason)
+{
+  switch (*reason)
+    {
+    case XmCR_CLIPBOARD_DATA_REQUEST:
+      {
+       Display *dpy = XtDisplay (widget);
+       Window window = (Window) *private_id;
+       Lisp_Object selection = assq_no_quit (QCLIPBOARD, Vselection_alist);
+       if (NILP (selection)) abort ();
+       selection = XCDR (selection);
+       if (!STRINGP (selection)) abort ();
+       XmClipboardCopyByName (dpy, window, *data_id,
+                              (char *) XSTRING_DATA (selection),
+                              XSTRING_LENGTH (selection) + 1,
+                              0);
+      }
+      break;
+    case XmCR_CLIPBOARD_DATA_DELETE:
+    default:
+      /* don't need to free anything */
+      break;
+    }
+}
+# endif /* MOTIF_INCREMENTAL_CLIPBOARDS_WORK */
+#endif /* MOTIF_CLIPBOARDS */
+
+
+/* Given a selection-name and desired type, this looks up our local copy of
+   the selection value and converts it to the type.  It returns nil or a
+   string.  This calls random elisp code, and may signal or gc.
+ */
+static Lisp_Object
+x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
+{
+  /* This function can GC */
+  Lisp_Object local_value = assq_no_quit (selection_symbol, Vselection_alist);
+  Lisp_Object handler_fn, value, check;
+
+  if (NILP (local_value)) return Qnil;
+
+  /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
+  if (EQ (target_type, QTIMESTAMP))
+    {
+      handler_fn = Qnil;
+      value = XCAR (XCDR (XCDR (local_value)));
+    }
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+  else if (CONSP (target_type) &&
+          XCAR (target_type) == QMULTIPLE)
+    {
+      Lisp_Object pairs = XCDR (target_type);
+      int len = XVECTOR_LENGTH (pairs);
+      int i;
+      /* If the target is MULTIPLE, then target_type looks like
+         (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
+        We modify the second element of each pair in the vector and
+        return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
+       */
+      for (i = 0; i < len; i++)
+       {
+         Lisp_Object pair = XVECTOR_DATA (pairs) [i];
+         XVECTOR_DATA (pair) [1] =
+           x_get_local_selection (XVECTOR_DATA (pair) [0],
+                                  XVECTOR_DATA (pair) [1]);
+       }
+      return pairs;
+    }
+#endif
+  else
+    {
+      CHECK_SYMBOL (target_type);
+      handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
+      if (NILP (handler_fn)) return Qnil;
+      value = call3 (handler_fn,
+                    selection_symbol, target_type,
+                    XCAR (XCDR (local_value)));
+    }
+
+  /* This lets the selection function to return (TYPE . VALUE).  For example,
+     when the selected type is LINE_NUMBER, the returned type is SPAN, not
+     INTEGER.
+   */
+  check = value;
+  if (CONSP (value) && SYMBOLP (XCAR (value)))
+    check = XCDR (value);
+
+  /* Strings, vectors, and symbols are converted to selection data format in
+     the obvious way.  Integers are converted to 16 bit quantities if they're
+     small enough, otherwise 32 bits are used.
+   */
+  if (STRINGP (check) ||
+      VECTORP (check) ||
+      SYMBOLP (check) ||
+      INTP    (check) ||
+      CHARP   (check) ||
+      NILP (value))
+    return value;
+
+  /* (N . M) or (N M) get turned into a 32 bit quantity.  So if you want to
+     always return a small quantity as 32 bits, your converter routine needs
+     to return a cons.
+   */
+  else if (CONSP (check) &&
+          INTP (XCAR (check)) &&
+          (INTP (XCDR (check)) ||
+           (CONSP (XCDR (check)) &&
+            INTP (XCAR (XCDR (check))) &&
+            NILP (XCDR (XCDR (check))))))
+    return value;
+  /* Otherwise the lisp converter function returned something unrecognized.
+   */
+  else
+    signal_error (Qerror,
+                  list3 (build_string
+                        ("unrecognized selection-conversion type"),
+                         handler_fn,
+                         value));
+
+  return Qnil; /* suppress compiler warning */
+}
+
+
+
+/* Send a SelectionNotify event to the requestor with property=None, meaning
+   we were unable to do what they wanted.
+ */
+static void
+x_decline_selection_request (XSelectionRequestEvent *event)
+{
+  XSelectionEvent reply;
+  reply.type      = SelectionNotify;
+  reply.display   = event->display;
+  reply.requestor = event->requestor;
+  reply.selection = event->selection;
+  reply.time      = event->time;
+  reply.target    = event->target;
+  reply.property  = None;
+
+  XSendEvent (reply.display, reply.requestor, False, 0L, (XEvent *) &reply);
+  XFlush (reply.display);
+}
+
+
+/* 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.
+ */
+static Lisp_Object
+x_selection_request_lisp_error (Lisp_Object closure)
+{
+  XSelectionRequestEvent *event = (XSelectionRequestEvent *)
+    get_opaque_ptr (closure);
+
+  free_opaque_ptr (closure);
+  if (event->type == 0) /* we set this to mean "completed normally" */
+    return Qnil;
+  x_decline_selection_request (event);
+  return Qnil;
+}
+
+
+/* Convert our selection to the requested type, and put that data where the
+   requestor wants it.  Then tell them whether we've succeeded.
+ */
+static void
+x_reply_selection_request (XSelectionRequestEvent *event, int format,
+                          unsigned char *data, int size, Atom type)
+{
+  /* This function can GC */
+  XSelectionEvent reply;
+  Display *display = event->display;
+  struct device *d = get_device_from_display (display);
+  Window window = event->requestor;
+  int bytes_remaining;
+  int format_bytes = format/8;
+  int max_bytes = SELECTION_QUANTUM (display);
+  if (max_bytes > MAX_SELECTION_QUANTUM) max_bytes = MAX_SELECTION_QUANTUM;
+
+  reply.type      = SelectionNotify;
+  reply.display   = display;
+  reply.requestor = window;
+  reply.selection = event->selection;
+  reply.time      = event->time;
+  reply.target    = event->target;
+  reply.property  = (event->property == None ? event->target : event->property);
+
+  /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
+
+  /* Store the data on the requested property.
+     If the selection is large, only store the first N bytes of it.
+   */
+  bytes_remaining = size * format_bytes;
+  if (bytes_remaining <= max_bytes)
+    {
+      /* Send all the data at once, with minimal handshaking. */
+#if 0
+      stderr_out ("\nStoring all %d\n", bytes_remaining);
+#endif
+      XChangeProperty (display, window, reply.property, type, format,
+                      PropModeReplace, data, size);
+      /* At this point, the selection was successfully stored; ack it. */
+      XSendEvent (display, window, False, 0L, (XEvent *) &reply);
+      XFlush (display);
+    }
+  else
+    {
+      /* Send an INCR selection. */
+      int prop_id;
+
+      if (x_window_to_frame (d, window)) /* #### debug */
+       error ("attempt to transfer an INCR to ourself!");
+#if 0
+      stderr_out ("\nINCR %d\n", bytes_remaining);
+#endif
+      prop_id = expect_property_change (display, window, reply.property,
+                                       PropertyDelete);
+
+      XChangeProperty (display, window, reply.property, DEVICE_XATOM_INCR (d),
+                      32, PropModeReplace, (unsigned char *)
+                      &bytes_remaining, 1);
+      XSelectInput (display, window, PropertyChangeMask);
+      /* Tell 'em the INCR data is there... */
+      XSendEvent (display, window, False, 0L, (XEvent *) &reply);
+      XFlush (display);
+
+      /* First, wait for the requestor to ack by deleting the property.
+        This can run random lisp code (process handlers) or signal.
+       */
+      wait_for_property_change (prop_id);
+
+      while (bytes_remaining)
+       {
+         int i = ((bytes_remaining < max_bytes)
+                  ? bytes_remaining
+                  : max_bytes);
+         prop_id = expect_property_change (display, window, reply.property,
+                                           PropertyDelete);
+#if 0
+         stderr_out ("  INCR adding %d\n", i);
+#endif
+         /* Append the next chunk of data to the property. */
+         XChangeProperty (display, window, reply.property, type, format,
+                          PropModeAppend, data, i / format_bytes);
+         bytes_remaining -= i;
+         data += i;
+
+         /* 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 (prop_id);
+       }
+      /* Now write a zero-length chunk to the property to tell the requestor
+        that we're done. */
+#if 0
+      stderr_out ("  INCR done\n");
+#endif
+      if (! waiting_for_other_props_on_window (display, window))
+       XSelectInput (display, window, 0L);
+
+      XChangeProperty (display, window, reply.property, type, format,
+                      PropModeReplace, data, 0);
+    }
+}
+
+
+
+/* Called from the event-loop in response to a SelectionRequest event.
+ */
+void
+x_handle_selection_request (XSelectionRequestEvent *event)
+{
+  /* This function can GC */
+  struct gcpro gcpro1, gcpro2, gcpro3;
+  XSelectionEvent reply;
+  Lisp_Object local_selection_data = Qnil;
+  Lisp_Object selection_symbol;
+  Lisp_Object target_symbol = Qnil;
+  Lisp_Object converted_selection = Qnil;
+  Time local_selection_time;
+  Lisp_Object successful_p = Qnil;
+  int count;
+  struct device *d = get_device_from_display (event->display);
+
+  GCPRO3 (local_selection_data, converted_selection, target_symbol);
+
+  reply.type      = SelectionNotify;           /* Construct the reply event */
+  reply.display   = event->display;
+  reply.requestor = event->requestor;
+  reply.selection = event->selection;
+  reply.time      = event->time;
+  reply.target    = event->target;
+  reply.property  = (event->property == None ? event->target : event->property);
+
+  selection_symbol = x_atom_to_symbol (d, event->selection);
+
+  local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
+
+#if 0
+# define CDR(x) (XCDR (x))
+# define CAR(x) (XCAR (x))
+  /* This list isn't user-visible, so it can't "go bad." */
+  if (!CONSP (local_selection_data)) abort ();
+  if (!CONSP (CDR (local_selection_data))) abort ();
+  if (!CONSP (CDR (CDR (local_selection_data)))) abort ();
+  if (!NILP (CDR (CDR (CDR (local_selection_data))))) abort ();
+  if (!CONSP (CAR (CDR (CDR (local_selection_data))))) abort ();
+  if (!INTP (CAR (CAR (CDR (CDR (local_selection_data)))))) abort ();
+  if (!INTP (CDR (CAR (CDR (CDR (local_selection_data)))))) abort ();
+# undef CAR
+# undef CDR
+#endif
+
+  if (NILP (local_selection_data))
+    {
+      /* Someone asked for the selection, but we don't have it any more.
+       */
+      x_decline_selection_request (event);
+      goto DONE_LABEL;
+    }
+
+  local_selection_time =
+    * (Time *) XOPAQUE_DATA (XCAR (XCDR (XCDR (local_selection_data))));
+
+  if (event->time != CurrentTime &&
+      local_selection_time > event->time)
+    {
+      /* Someone asked for the selection, and we have one, but not the one
+        they're looking for.
+       */
+      x_decline_selection_request (event);
+      goto DONE_LABEL;
+    }
+
+  count = specpdl_depth ();
+  record_unwind_protect (x_selection_request_lisp_error,
+                        make_opaque_ptr (event));
+  target_symbol = x_atom_to_symbol (d, event->target);
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+  if (EQ (target_symbol, QMULTIPLE))
+    target_symbol = fetch_multiple_target (event);
+#endif
+
+  /* Convert lisp objects back into binary data */
+
+  converted_selection =
+    x_get_local_selection (selection_symbol, target_symbol);
+
+  if (! NILP (converted_selection))
+    {
+      unsigned char *data;
+      unsigned int size;
+      int format;
+      Atom type;
+      lisp_data_to_selection_data (d, converted_selection,
+                                  &data, &type, &size, &format);
+
+      x_reply_selection_request (event, format, data, size, type);
+      successful_p = Qt;
+      /* Tell x_selection_request_lisp_error() it's cool. */
+      event->type = 0;
+      xfree (data);
+    }
+  unbind_to (count, Qnil);
+
+ DONE_LABEL:
+
+  UNGCPRO;
+
+  /* Let random lisp code notice that the selection has been asked for. */
+  {
+    Lisp_Object rest;
+    Lisp_Object val = Vx_sent_selection_hooks;
+    if (!UNBOUNDP (val) && !NILP (val))
+      {
+       if (CONSP (val) && !EQ (XCAR (val), Qlambda))
+         for (rest = val; !NILP (rest); rest = Fcdr (rest))
+           call3 (Fcar(rest), selection_symbol, target_symbol,
+                  successful_p);
+       else
+         call3 (val, selection_symbol, target_symbol,
+                successful_p);
+      }
+  }
+}
+
+
+/* Called from the event-loop in response to a SelectionClear event.
+ */
+void
+x_handle_selection_clear (XSelectionClearEvent *event)
+{
+  Display *display = event->display;
+  struct device *d = get_device_from_display (display);
+  Atom selection = event->selection;
+  Time changed_owner_time = event->time;
+
+  Lisp_Object selection_symbol, local_selection_data;
+  Time local_selection_time;
+
+  selection_symbol = x_atom_to_symbol (d, selection);
+
+  local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
+
+  /* Well, we already believe that we don't own it, so that's just fine. */
+  if (NILP (local_selection_data)) return;
+
+  local_selection_time =
+    * (Time *) XOPAQUE_DATA (XCAR (XCDR (XCDR (local_selection_data))));
+
+  /* This SelectionClear is for a selection that we no longer own, so we can
+     disregard it.  (That is, we have reasserted the selection since this
+     request was generated.)
+   */
+  if (changed_owner_time != CurrentTime &&
+      local_selection_time > changed_owner_time)
+    return;
+
+  /* Otherwise, we're really honest and truly being told to drop it.
+     Don't use Fdelq() as that may QUIT;.
+   */
+  if (EQ (local_selection_data, Fcar (Vselection_alist)))
+    Vselection_alist = Fcdr (Vselection_alist);
+  else
+    {
+      Lisp_Object rest;
+      for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
+       if (EQ (local_selection_data, Fcar (XCDR (rest))))
+         {
+           XCDR (rest) = Fcdr (XCDR (rest));
+           break;
+         }
+    }
+
+  /* Let random lisp code notice that the selection has been stolen.
+   */
+  {
+    Lisp_Object rest;
+    Lisp_Object val = Vx_lost_selection_hooks;
+    if (!UNBOUNDP (val) && !NILP (val))
+      {
+       if (CONSP (val) && !EQ (XCAR (val), Qlambda))
+         for (rest = val; !NILP (rest); rest = Fcdr (rest))
+           call1 (Fcar (rest), selection_symbol);
+       else
+         call1 (val, selection_symbol);
+      }
+  }
+}
+
+\f
+/* This stuff is so that INCR selections are reentrant (that is, so we can
+   be servicing multiple INCR selection requests simultaneously).  I haven't
+   actually tested that yet.
+ */
+
+static int prop_location_tick;
+
+static struct prop_location {
+  int tick;
+  Display *display;
+  Window window;
+  Atom property;
+  int desired_state;
+  struct prop_location *next;
+} *for_whom_the_bell_tolls;
+
+
+static int
+property_deleted_p (void *tick)
+{
+  struct prop_location *rest = for_whom_the_bell_tolls;
+  while (rest)
+    if (rest->tick == (long) tick)
+      return 0;
+    else
+      rest = rest->next;
+  return 1;
+}
+
+static int
+waiting_for_other_props_on_window (Display *display, Window window)
+{
+  struct prop_location *rest = for_whom_the_bell_tolls;
+  while (rest)
+    if (rest->display == display && rest->window == window)
+      return 1;
+    else
+      rest = rest->next;
+  return 0;
+}
+
+
+static int
+expect_property_change (Display *display, Window window,
+                       Atom property, int state)
+{
+  struct prop_location *pl = xnew (struct prop_location);
+  pl->tick = ++prop_location_tick;
+  pl->display = display;
+  pl->window = window;
+  pl->property = property;
+  pl->desired_state = state;
+  pl->next = for_whom_the_bell_tolls;
+  for_whom_the_bell_tolls = pl;
+  return pl->tick;
+}
+
+static void
+unexpect_property_change (int tick)
+{
+  struct prop_location *prev = 0, *rest = for_whom_the_bell_tolls;
+  while (rest)
+    {
+      if (rest->tick == tick)
+       {
+         if (prev)
+           prev->next = rest->next;
+         else
+           for_whom_the_bell_tolls = rest->next;
+         xfree (rest);
+         return;
+       }
+      prev = rest;
+      rest = rest->next;
+    }
+}
+
+static void
+wait_for_property_change (long tick)
+{
+  /* This function can GC */
+  wait_delaying_user_input (property_deleted_p, (void *) tick);
+}
+
+
+/* Called from the event-loop in response to a PropertyNotify event.
+ */
+void
+x_handle_property_notify (XPropertyEvent *event)
+{
+  struct prop_location *prev = 0, *rest = for_whom_the_bell_tolls;
+  while (rest)
+    {
+      if (rest->property == event->atom &&
+         rest->window == event->window &&
+         rest->display == event->display &&
+         rest->desired_state == event->state)
+       {
+#if 0
+         stderr_out ("Saw expected prop-%s on %s\n",
+                  (event->state == PropertyDelete ? "delete" : "change"),
+                     (char *) string_data (XSYMBOL (x_atom_to_symbol (get_device_from_display (event->display), event->atom))->name);
+#endif
+         if (prev)
+           prev->next = rest->next;
+         else
+           for_whom_the_bell_tolls = rest->next;
+         xfree (rest);
+         return;
+       }
+      prev = rest;
+      rest = rest->next;
+    }
+#if 0
+  stderr_out ("Saw UNexpected prop-%s on %s\n",
+          (event->state == PropertyDelete ? "delete" : "change"),
+          (char *) string_data (XSYMBOL (x_atom_to_symbol (get_device_from_display (event->display), event->atom))->name));
+#endif
+}
+
+
+\f
+#if 0 /* #### MULTIPLE doesn't work yet */
+
+static Lisp_Object
+fetch_multiple_target (XSelectionRequestEvent *event)
+{
+  /* This function can GC */
+  Display *display = event->display;
+  Window window = event->requestor;
+  Atom target = event->target;
+  Atom selection_atom = event->selection;
+  int result;
+
+  return
+    Fcons (QMULTIPLE,
+          x_get_window_property_as_lisp_data (display, window, target,
+                                              QMULTIPLE,
+                                              selection_atom));
+}
+
+static Lisp_Object
+copy_multiple_data (Lisp_Object obj)
+{
+  Lisp_Object vec;
+  int i;
+  int len;
+  if (CONSP (obj))
+    return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
+
+  CHECK_VECTOR (obj);
+  len = XVECTOR_LENGTH (obj);
+  vec = make_vector (len, Qnil);
+  for (i = 0; i < len; i++)
+    {
+      Lisp_Object vec2 = XVECTOR_DATA (obj) [i];
+      CHECK_VECTOR (vec2);
+      if (XVECTOR_LENGTH (vec2) != 2)
+       signal_error (Qerror, list2 (build_string
+                                    ("vectors must be of length 2"),
+                                     vec2));
+      XVECTOR_DATA (vec) [i] = make_vector (2, Qnil);
+      XVECTOR_DATA (XVECTOR_DATA (vec) [i]) [0] = XVECTOR_DATA (vec2) [0];
+      XVECTOR_DATA (XVECTOR_DATA (vec) [i]) [1] = XVECTOR_DATA (vec2) [1];
+    }
+  return vec;
+}
+
+#endif /* 0 */
+
+\f
+static Window reading_selection_reply;
+static Atom reading_which_selection;
+static int selection_reply_timed_out;
+
+static int
+selection_reply_done (void *ignore)
+{
+  return !reading_selection_reply;
+}
+
+static Lisp_Object Qx_selection_reply_timeout_internal;
+
+DEFUN ("x-selection-reply-timeout-internal", Fx_selection_reply_timeout_internal,
+       1, 1, 0, /*
+*/
+       (arg))
+{
+  selection_reply_timed_out = 1;
+  reading_selection_reply = 0;
+  return Qnil;
+}
+
+
+/* Do protocol to read selection-data from the server.
+   Converts this to lisp data and returns it.
+ */
+static Lisp_Object
+x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
+{
+  /* This function can GC */
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  struct frame *sel_frame = selected_frame ();
+  Window requestor_window = XtWindow (FRAME_X_TEXT_WIDGET (sel_frame));
+  Time requestor_time = DEVICE_X_MOUSE_TIMESTAMP (d);
+  Atom target_property = DEVICE_XATOM_EMACS_TMP (d);
+  Atom selection_atom = symbol_to_x_atom (d, selection_symbol, 0);
+  int speccount;
+  Atom type_atom = symbol_to_x_atom (d, (CONSP (target_type) ?
+                                        XCAR (target_type) : target_type), 0);
+
+  XConvertSelection (display, selection_atom, type_atom, target_property,
+                    requestor_window, requestor_time);
+
+  /* Block until the reply has been read. */
+  reading_selection_reply = requestor_window;
+  reading_which_selection = selection_atom;
+  selection_reply_timed_out = 0;
+
+  speccount = specpdl_depth ();
+
+  /* add a timeout handler */
+  if (x_selection_timeout > 0)
+    {
+      Lisp_Object id = Fadd_timeout (make_int (x_selection_timeout),
+                                    Qx_selection_reply_timeout_internal,
+                                    Qnil, Qnil);
+      record_unwind_protect (Fdisable_timeout, id);
+    }
+
+  /* This is ^Gable */
+  wait_delaying_user_input (selection_reply_done, 0);
+
+  if (selection_reply_timed_out)
+    error ("timed out waiting for reply from selection owner");
+
+  unbind_to (speccount, Qnil);
+
+  /* otherwise, the selection is waiting for us on the requested property. */
+  return
+    x_get_window_property_as_lisp_data (display, requestor_window,
+                                       target_property, target_type,
+                                       selection_atom);
+}
+
+
+static void
+x_get_window_property (Display *display, Window window, Atom property,
+                      unsigned char **data_ret, int *bytes_ret,
+                      Atom *actual_type_ret, int *actual_format_ret,
+                      unsigned long *actual_size_ret, int delete_p)
+{
+  int total_size;
+  unsigned long bytes_remaining;
+  int offset = 0;
+  unsigned char *tmp_data = 0;
+  int result;
+  int buffer_size = SELECTION_QUANTUM (display);
+  if (buffer_size > MAX_SELECTION_QUANTUM) buffer_size = MAX_SELECTION_QUANTUM;
+
+  /* First probe the thing to find out how big it is. */
+  result = XGetWindowProperty (display, window, property,
+                              0, 0, False, AnyPropertyType,
+                              actual_type_ret, actual_format_ret,
+                              actual_size_ret,
+                              &bytes_remaining, &tmp_data);
+  if (result != Success)
+    {
+      *data_ret = 0;
+      *bytes_ret = 0;
+      return;
+    }
+  XFree ((char *) tmp_data);
+
+  if (*actual_type_ret == None || *actual_format_ret == 0)
+    {
+      if (delete_p) XDeleteProperty (display, window, property);
+      *data_ret = 0;
+      *bytes_ret = 0;
+      return;
+    }
+
+  total_size = bytes_remaining + 1;
+  *data_ret = (unsigned char *) xmalloc (total_size);
+
+  /* Now read, until weve gotten it all. */
+  while (bytes_remaining)
+    {
+#if 0
+      int last = bytes_remaining;
+#endif
+      result =
+       XGetWindowProperty (display, window, property,
+                           offset/4, buffer_size/4,
+                           (delete_p ? True : False),
+                           AnyPropertyType,
+                           actual_type_ret, actual_format_ret,
+                           actual_size_ret, &bytes_remaining, &tmp_data);
+#if 0
+      stderr_out ("<< read %d\n", last-bytes_remaining);
+#endif
+      /* If this doesn't return Success at this point, it means that
+        some clod deleted the selection while we were in the midst of
+        reading it.  Deal with that, I guess....
+       */
+      if (result != Success) break;
+      *actual_size_ret *= *actual_format_ret / 8;
+      memcpy ((*data_ret) + offset, tmp_data, *actual_size_ret);
+      offset += *actual_size_ret;
+      XFree ((char *) tmp_data);
+    }
+  *bytes_ret = offset;
+}
+
+
+static void
+receive_incremental_selection (Display *display, Window window, Atom property,
+                              /* this one is for error messages only */
+                              Lisp_Object target_type,
+                              unsigned int min_size_bytes,
+                              unsigned char **data_ret, int *size_bytes_ret,
+                              Atom *type_ret, int *format_ret,
+                              unsigned long *size_ret)
+{
+  /* This function can GC */
+  int offset = 0;
+  int prop_id;
+  *size_bytes_ret = min_size_bytes;
+  *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
+#if 0
+  stderr_out ("\nread INCR %d\n", min_size_bytes);
+#endif
+  /* At this point, we have read an INCR property, and deleted it (which
+     is how we ack its receipt: the sending window will be selecting
+     PropertyNotify events on our window to notice this).
+
+     Now, we must loop, waiting for the sending window to put a value on
+     that property, then reading the property, then deleting it to ack.
+     We are done when the sender places a property of length 0.
+   */
+  prop_id = expect_property_change (display, window, property,
+                                   PropertyNewValue);
+  while (1)
+    {
+      unsigned char *tmp_data;
+      int tmp_size_bytes;
+      wait_for_property_change (prop_id);
+      /* 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.
+       */
+      prop_id = expect_property_change (display, window, property,
+                                       PropertyNewValue);
+      x_get_window_property (display, window, property,
+                            &tmp_data, &tmp_size_bytes,
+                            type_ret, format_ret, size_ret, 1);
+
+      if (tmp_size_bytes == 0) /* we're done */
+       {
+#if 0
+         stderr_out ("  read INCR done\n");
+#endif
+         unexpect_property_change (prop_id);
+         if (tmp_data) xfree (tmp_data);
+         break;
+       }
+#if 0
+      stderr_out ("  read INCR %d\n", tmp_size_bytes);
+#endif
+      if (*size_bytes_ret < offset + tmp_size_bytes)
+       {
+#if 0
+         stderr_out ("  read INCR realloc %d -> %d\n",
+                  *size_bytes_ret, offset + tmp_size_bytes);
+#endif
+         *size_bytes_ret = offset + tmp_size_bytes;
+         *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
+       }
+      memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
+      offset += tmp_size_bytes;
+      xfree (tmp_data);
+    }
+}
+
+
+static Lisp_Object
+x_get_window_property_as_lisp_data (Display *display,
+                                   Window window,
+                                   Atom property,
+                                   /* next two for error messages only */
+                                   Lisp_Object target_type,
+                                   Atom selection_atom)
+{
+  /* This function can GC */
+  Atom actual_type;
+  int actual_format;
+  unsigned long actual_size;
+  unsigned char *data = NULL;
+  int bytes = 0;
+  Lisp_Object val;
+  struct device *d = get_device_from_display (display);
+
+  x_get_window_property (display, window, property, &data, &bytes,
+                        &actual_type, &actual_format, &actual_size, 1);
+  if (! data)
+    {
+      if (XGetSelectionOwner (display, selection_atom))
+       /* there is a selection owner */
+       signal_error
+         (Qselection_conversion_error,
+          Fcons (build_string ("selection owner couldn't convert"),
+                 Fcons (x_atom_to_symbol (d, selection_atom),
+                        actual_type ?
+                        list2 (target_type, x_atom_to_symbol (d, actual_type)) :
+                        list1 (target_type))));
+      else
+       signal_error (Qerror,
+                     list2 (build_string ("no selection"),
+                            x_atom_to_symbol (d, selection_atom)));
+    }
+
+  if (actual_type == DEVICE_XATOM_INCR (d))
+    {
+      /* Ok, that data wasn't *the* data, it was just the beginning. */
+
+      unsigned int min_size_bytes = * ((unsigned int *) data);
+      xfree (data);
+      receive_incremental_selection (display, window, property, target_type,
+                                    min_size_bytes, &data, &bytes,
+                                    &actual_type, &actual_format,
+                                    &actual_size);
+    }
+
+  /* It's been read.  Now convert it to a lisp object in some semi-rational
+     manner. */
+  val = selection_data_to_lisp_data (d, data, bytes,
+                                    actual_type, actual_format);
+
+  xfree (data);
+  return val;
+}
+\f
+/* These functions convert from the selection data read from the server into
+   something that we can use from elisp, and vice versa.
+
+       Type:   Format: Size:           Elisp Type:
+       -----   ------- -----           -----------
+       *       8       *               String
+       ATOM    32      1               Symbol
+       ATOM    32      > 1             Vector of Symbols
+       *       16      1               Integer
+       *       16      > 1             Vector of Integers
+       *       32      1               if <=16 bits: Integer
+                                       if > 16 bits: Cons of top16, bot16
+       *       32      > 1             Vector of the above
+
+   When converting a Lisp number to C, it is assumed to be of format 16 if
+   it is an integer, and of format 32 if it is a cons of two integers.
+
+   When converting a vector of numbers from Elisp to C, it is assumed to be
+   of format 16 if every element in the vector is an integer, and is assumed
+   to be of format 32 if any element is a cons of two integers.
+
+   When converting an object to C, it may be of the form (SYMBOL . <data>)
+   where SYMBOL is what we should claim that the type is.  Format and
+   representation are as above.
+
+   NOTE: Under Mule, when someone shoves us a string without a type, we
+   set the type to 'COMPOUND_TEXT and automatically convert to Compound
+   Text.  If the string has a type, we assume that the user wants the
+   data sent as-is so we just do "binary" conversion.
+ */
+
+
+static Lisp_Object
+selection_data_to_lisp_data (struct device *d,
+                            unsigned char *data,
+                            size_t size,
+                            Atom type,
+                            int format)
+{
+  if (type == DEVICE_XATOM_NULL (d))
+    return QNULL;
+
+  /* Convert any 8-bit data to a string, for compactness. */
+  else if (format == 8)
+    return make_ext_string (data, size,
+                           type == DEVICE_XATOM_TEXT (d) ||
+                           type == DEVICE_XATOM_COMPOUND_TEXT (d)
+                           ? FORMAT_CTEXT : FORMAT_BINARY);
+
+  /* Convert a single atom to a Lisp Symbol.  Convert a set of atoms to
+     a vector of symbols.
+   */
+  else if (type == XA_ATOM)
+    {
+      if (size == sizeof (Atom))
+       return x_atom_to_symbol (d, *((Atom *) data));
+      else
+       {
+         int i;
+         int len = size / sizeof (Atom);
+         Lisp_Object v = Fmake_vector (make_int (len), Qzero);
+         for (i = 0; i < len; i++)
+           Faset (v, make_int (i), x_atom_to_symbol (d, ((Atom *) data) [i]));
+         return v;
+       }
+    }
+
+  /* Convert a single 16 or small 32 bit number to a Lisp Int.
+     If the number is > 16 bits, convert it to a cons of integers,
+     16 bits in each half.
+   */
+  else if (format == 32 && size == sizeof (long))
+    return word_to_lisp (((unsigned long *) data) [0]);
+  else if (format == 16 && size == sizeof (short))
+    return make_int ((int) (((unsigned short *) data) [0]));
+
+  /* Convert any other kind of data to a vector of numbers, represented
+     as above (as an integer, or a cons of two 16 bit integers).
+
+     #### Perhaps we should return the actual type to lisp as well.
+
+       (x-get-selection-internal 'PRIMARY 'LINE_NUMBER)
+       ==> [4 4]
+
+     and perhaps it should be
+
+       (x-get-selection-internal 'PRIMARY 'LINE_NUMBER)
+       ==> (SPAN . [4 4])
+
+     Right now the fact that the return type was SPAN is discarded before
+     lisp code gets to see it.
+   */
+  else if (format == 16)
+    {
+      int i;
+      Lisp_Object v = make_vector (size / 4, Qzero);
+      for (i = 0; i < (int) size / 4; i++)
+       {
+         int j = (int) ((unsigned short *) data) [i];
+         Faset (v, make_int (i), make_int (j));
+       }
+      return v;
+    }
+  else
+    {
+      int i;
+      Lisp_Object v = make_vector (size / 4, Qzero);
+      for (i = 0; i < (int) size / 4; i++)
+       {
+         unsigned long j = ((unsigned long *) data) [i];
+         Faset (v, make_int (i), word_to_lisp (j));
+       }
+      return v;
+    }
+}
+
+
+static void
+lisp_data_to_selection_data (struct device *d,
+                            Lisp_Object obj,
+                            unsigned char **data_ret,
+                            Atom *type_ret,
+                            unsigned int *size_ret,
+                            int *format_ret)
+{
+  Lisp_Object type = Qnil;
+
+  if (CONSP (obj) && SYMBOLP (XCAR (obj)))
+    {
+      type = XCAR (obj);
+      obj = XCDR (obj);
+      if (CONSP (obj) && NILP (XCDR (obj)))
+       obj = XCAR (obj);
+    }
+
+  if (EQ (obj, QNULL) || (EQ (type, QNULL)))
+    {                          /* This is not the same as declining */
+      *format_ret = 32;
+      *size_ret = 0;
+      *data_ret = 0;
+      type = QNULL;
+    }
+  else if (STRINGP (obj))
+    {
+      CONST Extbyte *extval;
+      Extcount extvallen;
+
+      if (NILP (type))
+       GET_STRING_CTEXT_DATA_ALLOCA (obj, extval, extvallen);
+      else
+       GET_STRING_BINARY_DATA_ALLOCA (obj, extval, extvallen);
+      *format_ret = 8;
+      *size_ret = extvallen;
+      *data_ret = (unsigned char *) xmalloc (*size_ret);
+      memcpy (*data_ret, extval, *size_ret);
+#ifdef MULE
+      if (NILP (type)) type = QCOMPOUND_TEXT;
+#else
+      if (NILP (type)) type = QSTRING;
+#endif
+    }
+  else if (CHARP (obj))
+    {
+      Bufbyte buf[MAX_EMCHAR_LEN];
+      Bytecount len;
+      CONST Extbyte *extval;
+      Extcount extvallen;
+
+      *format_ret = 8;
+      len = set_charptr_emchar (buf, XCHAR (obj));
+      GET_CHARPTR_EXT_CTEXT_DATA_ALLOCA (buf, len, extval, extvallen);
+      *size_ret = extvallen;
+      *data_ret = (unsigned char *) xmalloc (*size_ret);
+      memcpy (*data_ret, extval, *size_ret);
+#ifdef MULE
+      if (NILP (type)) type = QCOMPOUND_TEXT;
+#else
+      if (NILP (type)) type = QSTRING;
+#endif
+    }
+  else if (SYMBOLP (obj))
+    {
+      *format_ret = 32;
+      *size_ret = 1;
+      *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
+      (*data_ret) [sizeof (Atom)] = 0;
+      (*(Atom **) data_ret) [0] = symbol_to_x_atom (d, obj, 0);
+      if (NILP (type)) type = QATOM;
+    }
+  else if (INTP (obj) &&
+          XINT (obj) <= 0x7FFF &&
+          XINT (obj) >= -0x8000)
+    {
+      *format_ret = 16;
+      *size_ret = 1;
+      *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
+      (*data_ret) [sizeof (short)] = 0;
+      (*(short **) data_ret) [0] = (short) XINT (obj);
+      if (NILP (type)) type = QINTEGER;
+    }
+  else if (INTP (obj) || CONSP (obj))
+    {
+      *format_ret = 32;
+      *size_ret = 1;
+      *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
+      (*data_ret) [sizeof (long)] = 0;
+      (*(unsigned long **) data_ret) [0] = lisp_to_word (obj);
+      if (NILP (type)) type = QINTEGER;
+    }
+  else if (VECTORP (obj))
+    {
+      /* Lisp Vectors may represent a set of ATOMs;
+        a set of 16 or 32 bit INTEGERs;
+        or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
+       */
+      int i;
+
+      if (SYMBOLP (XVECTOR_DATA (obj) [0]))
+       /* This vector is an ATOM set */
+       {
+         if (NILP (type)) type = QATOM;
+         *size_ret = XVECTOR_LENGTH (obj);
+         *format_ret = 32;
+         *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
+         for (i = 0; i < (int) (*size_ret); i++)
+           if (SYMBOLP (XVECTOR_DATA (obj) [i]))
+             (*(Atom **) data_ret) [i] =
+               symbol_to_x_atom (d, XVECTOR_DATA (obj) [i], 0);
+           else
+              signal_error (Qerror, /* Qselection_error */
+                            list2 (build_string
+                  ("all elements of the vector must be of the same type"),
+                                   obj));
+       }
+#if 0 /* #### MULTIPLE doesn't work yet */
+      else if (VECTORP (XVECTOR_DATA (obj) [0]))
+       /* This vector is an ATOM_PAIR set */
+       {
+         if (NILP (type)) type = QATOM_PAIR;
+         *size_ret = XVECTOR_LENGTH (obj);
+         *format_ret = 32;
+         *data_ret = (unsigned char *)
+           xmalloc ((*size_ret) * sizeof (Atom) * 2);
+         for (i = 0; i < *size_ret; i++)
+           if (VECTORP (XVECTOR_DATA (obj) [i]))
+             {
+               Lisp_Object pair = XVECTOR_DATA (obj) [i];
+               if (XVECTOR_LENGTH (pair) != 2)
+                 signal_error (Qerror,
+                                list2 (build_string
+       ("elements of the vector must be vectors of exactly two elements"),
+                                 pair));
+
+               (*(Atom **) data_ret) [i * 2] =
+                 symbol_to_x_atom (d, XVECTOR_DATA (pair) [0], 0);
+               (*(Atom **) data_ret) [(i * 2) + 1] =
+                 symbol_to_x_atom (d, XVECTOR_DATA (pair) [1], 0);
+             }
+           else
+             signal_error (Qerror,
+                            list2 (build_string
+                  ("all elements of the vector must be of the same type"),
+                                   obj));
+       }
+#endif
+      else
+       /* This vector is an INTEGER set, or something like it */
+       {
+         *size_ret = XVECTOR_LENGTH (obj);
+         if (NILP (type)) type = QINTEGER;
+         *format_ret = 16;
+         for (i = 0; i < (int) (*size_ret); i++)
+           if (CONSP (XVECTOR_DATA (obj) [i]))
+             *format_ret = 32;
+           else if (!INTP (XVECTOR_DATA (obj) [i]))
+             signal_error (Qerror, /* Qselection_error */
+                            list2 (build_string
+       ("all elements of the vector must be integers or conses of integers"),
+                                   obj));
+
+         *data_ret = (unsigned char *) xmalloc (*size_ret * (*format_ret/8));
+         for (i = 0; i < (int) (*size_ret); i++)
+           if (*format_ret == 32)
+             (*((unsigned long **) data_ret)) [i] =
+               lisp_to_word (XVECTOR_DATA (obj) [i]);
+           else
+             (*((unsigned short **) data_ret)) [i] =
+               (unsigned short) lisp_to_word (XVECTOR_DATA (obj) [i]);
+       }
+    }
+  else
+    signal_error (Qerror, /* Qselection_error */
+                  list2 (build_string ("unrecognized selection data"),
+                         obj));
+
+  *type_ret = symbol_to_x_atom (d, type, 0);
+}
+
+static Lisp_Object
+clean_local_selection_data (Lisp_Object obj)
+{
+  if (CONSP (obj) &&
+      INTP (XCAR (obj)) &&
+      CONSP (XCDR (obj)) &&
+      INTP (XCAR (XCDR (obj))) &&
+      NILP (XCDR (XCDR (obj))))
+    obj = Fcons (XCAR (obj), XCDR (obj));
+
+  if (CONSP (obj) &&
+      INTP (XCAR (obj)) &&
+      INTP (XCDR (obj)))
+    {
+      if (XINT (XCAR (obj)) == 0)
+       return XCDR (obj);
+      if (XINT (XCAR (obj)) == -1)
+       return make_int (- XINT (XCDR (obj)));
+    }
+  if (VECTORP (obj))
+    {
+      int i;
+      int len = XVECTOR_LENGTH (obj);
+      Lisp_Object copy;
+      if (len == 1)
+       return clean_local_selection_data (XVECTOR_DATA (obj) [0]);
+      copy = make_vector (len, Qnil);
+      for (i = 0; i < len; i++)
+       XVECTOR_DATA (copy) [i] =
+         clean_local_selection_data (XVECTOR_DATA (obj) [i]);
+      return copy;
+    }
+  return obj;
+}
+
+\f
+/* Called from the event loop to handle SelectionNotify events.
+   I don't think this needs to be reentrant.
+ */
+void
+x_handle_selection_notify (XSelectionEvent *event)
+{
+  if (! reading_selection_reply)
+    message ("received an unexpected SelectionNotify event");
+  else if (event->requestor != reading_selection_reply)
+    message ("received a SelectionNotify event for the wrong window");
+  else if (event->selection != reading_which_selection)
+    message ("received the wrong selection type in SelectionNotify!");
+  else
+    reading_selection_reply = 0; /* we're done now. */
+}
+
+\f
+DEFUN ("x-own-selection-internal", Fx_own_selection_internal, 2, 2, 0, /*
+Assert an X selection of the given TYPE with the given VALUE.
+TYPE is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
+VALUE is typically a string, or a cons of two markers, but may be
+anything that the functions on selection-converter-alist know about.
+*/
+       (selection_name, selection_value))
+{
+  CHECK_SYMBOL (selection_name);
+  if (NILP (selection_value)) error ("selection-value may not be nil.");
+  x_own_selection (selection_name, selection_value);
+  return selection_value;
+}
+
+
+/* Request the selection value from the owner.  If we are the owner,
+   simply return our selection value.  If we are not the owner, this
+   will block until all of the data has arrived.
+ */
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal, 2, 2, 0, /*
+Return text selected from some X window.
+SELECTION_SYMBOL is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
+TARGET_TYPE is the type of data desired, typically STRING or COMPOUND_TEXT.
+Under Mule, if the resultant data comes back as 8-bit data in type
+TEXT or COMPOUND_TEXT, it will be decoded as Compound Text.
+*/
+       (selection_symbol, target_type))
+{
+  /* This function can GC */
+  Lisp_Object val = Qnil;
+  struct gcpro gcpro1, gcpro2;
+  GCPRO2 (target_type, val); /* we store newly consed data into these */
+  CHECK_SYMBOL (selection_symbol);
+
+#if 0 /* #### MULTIPLE doesn't work yet */
+  if (CONSP (target_type) &&
+      XCAR (target_type) == QMULTIPLE)
+    {
+      CHECK_VECTOR (XCDR (target_type));
+      /* So we don't destructively modify this... */
+      target_type = copy_multiple_data (target_type);
+    }
+  else
+#endif
+    CHECK_SYMBOL (target_type);
+
+  val = x_get_local_selection (selection_symbol, target_type);
+
+  if (NILP (val))
+    {
+      val = x_get_foreign_selection (selection_symbol, target_type);
+    }
+  else
+    {
+      if (CONSP (val) && SYMBOLP (XCAR (val)))
+       {
+         val = XCDR (val);
+         if (CONSP (val) && NILP (XCDR (val)))
+           val = XCAR (val);
+       }
+      val = clean_local_selection_data (val);
+    }
+  UNGCPRO;
+  return val;
+}
+
+DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, 1, 2, 0, /*
+If we own the named selection, then disown it (make there be no selection).
+*/
+       (selection, timeval))
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  Time timestamp;
+  Atom selection_atom;
+  XSelectionClearEvent event;
+
+  CHECK_SYMBOL (selection);
+  if (NILP (timeval))
+    timestamp = DEVICE_X_MOUSE_TIMESTAMP (d);
+  else
+    {
+      /* #### This is bogus.  See the comment above about problems
+        on OSF/1 and DEC Alphas.  Yet another reason why it sucks
+        to have the implementation (i.e. cons of two 16-bit
+        integers) exposed. */
+      time_t the_time;
+      lisp_to_time (timeval, &the_time);
+      timestamp = (Time) the_time;
+    }
+
+  if (NILP (assq_no_quit (selection, Vselection_alist)))
+    return Qnil;  /* Don't disown the selection when we're not the owner. */
+
+  selection_atom = symbol_to_x_atom (d, selection, 0);
+
+  XSetSelectionOwner (display, selection_atom, None, timestamp);
+
+  /* It doesn't seem to be guaranteed that a SelectionClear event will be
+     generated for a window which owns the selection when that window sets
+     the selection owner to None.  The NCD server does, the MIT Sun4 server
+     doesn't.  So we synthesize one; this means we might get two, but
+     that's ok, because the second one won't have any effect.
+   */
+  event.display = display;
+  event.selection = selection_atom;
+  event.time = timestamp;
+  x_handle_selection_clear (&event);
+
+  return Qt;
+}
+
+
+DEFUN ("x-selection-owner-p", Fx_selection_owner_p, 0, 1, 0, /*
+Return t if current emacs process owns the given X Selection.
+The arg should be the name of the selection in question, typically one of
+the symbols PRIMARY, SECONDARY, or CLIPBOARD.  (For convenience, the symbol
+nil is the same as PRIMARY, and t is the same as SECONDARY.)
+*/
+       (selection))
+{
+  CHECK_SYMBOL (selection);
+  if      (EQ (selection, Qnil)) selection = QPRIMARY;
+  else if (EQ (selection, Qt))   selection = QSECONDARY;
+
+  return NILP (Fassq (selection, Vselection_alist)) ? Qnil : Qt;
+}
+
+DEFUN ("x-selection-exists-p", Fx_selection_exists_p, 0, 1, 0, /*
+Whether there is an owner for the given X Selection.
+The arg should be the name of the selection in question, typically one of
+the symbols PRIMARY, SECONDARY, or CLIPBOARD.  (For convenience, the symbol
+nil is the same as PRIMARY, and t is the same as SECONDARY.)
+*/
+       (selection))
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *dpy = DEVICE_X_DISPLAY (d);
+  CHECK_SYMBOL (selection);
+  if (!NILP (Fx_selection_owner_p (selection)))
+    return Qt;
+  return XGetSelectionOwner (dpy, symbol_to_x_atom (d, selection, 0)) != None ?
+    Qt : Qnil;
+}
+
+\f
+#ifdef CUT_BUFFER_SUPPORT
+
+static int cut_buffers_initialized; /* Whether we're sure they all exist */
+
+/* Ensure that all 8 cut buffers exist.  ICCCM says we gotta... */
+static void
+initialize_cut_buffers (Display *display, Window window)
+{
+  static unsigned CONST char * CONST data = (unsigned CONST char *) "";
+#define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
+                                   PropModeAppend, data, 0)
+  FROB (XA_CUT_BUFFER0);
+  FROB (XA_CUT_BUFFER1);
+  FROB (XA_CUT_BUFFER2);
+  FROB (XA_CUT_BUFFER3);
+  FROB (XA_CUT_BUFFER4);
+  FROB (XA_CUT_BUFFER5);
+  FROB (XA_CUT_BUFFER6);
+  FROB (XA_CUT_BUFFER7);
+#undef FROB
+  cut_buffers_initialized = 1;
+}
+
+#define CHECK_CUTBUFFER(symbol)                                                \
+  { CHECK_SYMBOL (symbol);                                             \
+    if (!EQ((symbol),QCUT_BUFFER0) && !EQ((symbol),QCUT_BUFFER1) &&    \
+       !EQ((symbol),QCUT_BUFFER2) && !EQ((symbol),QCUT_BUFFER3) &&     \
+       !EQ((symbol),QCUT_BUFFER4) && !EQ((symbol),QCUT_BUFFER5) &&     \
+       !EQ((symbol),QCUT_BUFFER6) && !EQ((symbol),QCUT_BUFFER7))       \
+      signal_error (Qerror, list2 (build_string ("Doesn't name a cutbuffer"), \
+                                   (symbol))); \
+  }
+
+DEFUN ("x-get-cutbuffer-internal", Fx_get_cutbuffer_internal, 1, 1, 0, /*
+Return the value of the named CUTBUFFER (typically CUT_BUFFER0).
+*/
+       (cutbuffer))
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+  Atom cut_buffer_atom;
+  unsigned char *data;
+  int bytes;
+  Atom type;
+  int format;
+  unsigned long size;
+  Lisp_Object ret;
+
+  CHECK_CUTBUFFER (cutbuffer);
+  cut_buffer_atom = symbol_to_x_atom (d, cutbuffer, 0);
+
+  x_get_window_property (display, window, cut_buffer_atom, &data, &bytes,
+                        &type, &format, &size, 0);
+  if (!data) return Qnil;
+
+  if (format != 8 || type != XA_STRING)
+    signal_simple_error_2 ("Cut buffer doesn't contain 8-bit STRING data",
+                          x_atom_to_symbol (d, type),
+                          make_int (format));
+
+  /* We cheat - if the string contains an ESC character, that's
+     technically not allowed in a STRING, so we assume it's
+     COMPOUND_TEXT that we stored there ourselves earlier,
+     in x-store-cutbuffer-internal  */
+  ret = (bytes ?
+        make_ext_string (data, bytes,
+                         memchr (data, 0x1b, bytes) ?
+                         FORMAT_CTEXT : FORMAT_BINARY)
+        : Qnil);
+  xfree (data);
+  return ret;
+}
+
+
+DEFUN ("x-store-cutbuffer-internal", Fx_store_cutbuffer_internal, 2, 2, 0, /*
+Set the value of the named CUTBUFFER (typically CUT_BUFFER0) to STRING.
+*/
+       (cutbuffer, string))
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+  Atom cut_buffer_atom;
+  CONST Extbyte *data  = XSTRING_DATA (string);
+  Extcount bytes = XSTRING_LENGTH (string);
+  Extcount bytes_remaining;
+  int max_bytes = SELECTION_QUANTUM (display);
+#ifdef MULE
+  CONST Bufbyte *ptr, *end;
+  enum { ASCII, LATIN_1, WORLD } chartypes = ASCII;
+#endif
+
+  if (max_bytes > MAX_SELECTION_QUANTUM)
+    max_bytes = MAX_SELECTION_QUANTUM;
+
+  CHECK_CUTBUFFER (cutbuffer);
+  CHECK_STRING (string);
+  cut_buffer_atom = symbol_to_x_atom (d, cutbuffer, 0);
+
+  if (! cut_buffers_initialized)
+    initialize_cut_buffers (display, window);
+
+  /* We use the STRING encoding (Latin-1 only) if we can, else COMPOUND_TEXT.
+     We cheat and use type = `STRING' even when using COMPOUND_TEXT.
+     The ICCCM requires that this be so, and other clients assume it,
+     as we do ourselves in initialize_cut_buffers.  */
+
+#ifdef MULE
+  /* Optimize for the common ASCII case */
+  for (ptr = data, end = ptr + bytes; ptr <= end; )
+    {
+      if (BYTE_ASCII_P (*ptr))
+       {
+         ptr++;
+         continue;
+       }
+
+      if ((*ptr) == LEADING_BYTE_LATIN_ISO8859_1 ||
+         (*ptr) == LEADING_BYTE_CONTROL_1)
+       {
+         chartypes = LATIN_1;
+         ptr += 2;
+         continue;
+       }
+
+      chartypes = WORLD;
+      break;
+    }
+
+  if (chartypes == LATIN_1)
+    GET_STRING_BINARY_DATA_ALLOCA (string, data, bytes);
+  else if (chartypes == WORLD)
+    GET_STRING_CTEXT_DATA_ALLOCA  (string, data, bytes);
+#endif /* MULE */
+
+  bytes_remaining = bytes;
+
+  while (bytes_remaining)
+    {
+      int chunk = bytes_remaining < max_bytes ? bytes_remaining : max_bytes;
+      XChangeProperty (display, window, cut_buffer_atom, XA_STRING, 8,
+                      (bytes_remaining == bytes
+                       ? PropModeReplace : PropModeAppend),
+                      data, chunk);
+      data += chunk;
+      bytes_remaining -= chunk;
+    }
+  return string;
+}
+
+
+DEFUN ("x-rotate-cutbuffers-internal", Fx_rotate_cutbuffers_internal, 1, 1, 0, /*
+Rotate the values of the cutbuffers by the given number of steps;
+positive means move values forward, negative means backward.
+*/
+       (n))
+{
+  struct device *d = decode_x_device (Qnil);
+  Display *display = DEVICE_X_DISPLAY (d);
+  Window window = RootWindow (display, 0); /* Cutbuffers are on frame 0 */
+  Atom props [8];
+
+  CHECK_INT (n);
+  if (XINT (n) == 0)
+    return n;
+  if (! cut_buffers_initialized)
+    initialize_cut_buffers (display, window);
+  props[0] = XA_CUT_BUFFER0;
+  props[1] = XA_CUT_BUFFER1;
+  props[2] = XA_CUT_BUFFER2;
+  props[3] = XA_CUT_BUFFER3;
+  props[4] = XA_CUT_BUFFER4;
+  props[5] = XA_CUT_BUFFER5;
+  props[6] = XA_CUT_BUFFER6;
+  props[7] = XA_CUT_BUFFER7;
+  XRotateWindowProperties (display, window, props, 8, XINT (n));
+  return n;
+}
+
+#endif /* CUT_BUFFER_SUPPORT */
+
+
+\f
+/************************************************************************/
+/*                            initialization                            */
+/************************************************************************/
+
+void
+syms_of_xselect (void)
+{
+  DEFSUBR (Fx_get_selection_internal);
+  DEFSUBR (Fx_own_selection_internal);
+  DEFSUBR (Fx_disown_selection_internal);
+  DEFSUBR (Fx_selection_owner_p);
+  DEFSUBR (Fx_selection_exists_p);
+
+#ifdef CUT_BUFFER_SUPPORT
+  DEFSUBR (Fx_get_cutbuffer_internal);
+  DEFSUBR (Fx_store_cutbuffer_internal);
+  DEFSUBR (Fx_rotate_cutbuffers_internal);
+#endif /* CUT_BUFFER_SUPPORT */
+
+  /* Unfortunately, timeout handlers must be lisp functions. */
+  defsymbol (&Qx_selection_reply_timeout_internal,
+             "x-selection-reply-timeout-internal");
+  DEFSUBR (Fx_selection_reply_timeout_internal);
+
+  defsymbol (&QPRIMARY, "PRIMARY");
+  defsymbol (&QSECONDARY, "SECONDARY");
+  defsymbol (&QSTRING, "STRING");
+  defsymbol (&QINTEGER, "INTEGER");
+  defsymbol (&QCLIPBOARD, "CLIPBOARD");
+  defsymbol (&QTIMESTAMP, "TIMESTAMP");
+  defsymbol (&QTEXT, "TEXT");
+  defsymbol (&QDELETE, "DELETE");
+  defsymbol (&QMULTIPLE, "MULTIPLE");
+  defsymbol (&QINCR, "INCR");
+  defsymbol (&QEMACS_TMP, "_EMACS_TMP_");
+  defsymbol (&QTARGETS, "TARGETS");
+  defsymbol (&QATOM, "ATOM");
+  defsymbol (&QATOM_PAIR, "ATOM_PAIR");
+  defsymbol (&QCOMPOUND_TEXT, "COMPOUND_TEXT");
+  defsymbol (&QNULL, "NULL");
+
+#ifdef CUT_BUFFER_SUPPORT
+  defsymbol (&QCUT_BUFFER0, "CUT_BUFFER0");
+  defsymbol (&QCUT_BUFFER1, "CUT_BUFFER1");
+  defsymbol (&QCUT_BUFFER2, "CUT_BUFFER2");
+  defsymbol (&QCUT_BUFFER3, "CUT_BUFFER3");
+  defsymbol (&QCUT_BUFFER4, "CUT_BUFFER4");
+  defsymbol (&QCUT_BUFFER5, "CUT_BUFFER5");
+  defsymbol (&QCUT_BUFFER6, "CUT_BUFFER6");
+  defsymbol (&QCUT_BUFFER7, "CUT_BUFFER7");
+#endif /* CUT_BUFFER_SUPPORT */
+
+  deferror (&Qselection_conversion_error,
+           "selection-conversion-error",
+           "selection-conversion error", Qio_error);
+}
+
+void
+vars_of_xselect (void)
+{
+#ifdef CUT_BUFFER_SUPPORT
+  cut_buffers_initialized = 0;
+  Fprovide (intern ("cut-buffer"));
+#endif
+
+  reading_selection_reply = 0;
+  reading_which_selection = 0;
+  selection_reply_timed_out = 0;
+  for_whom_the_bell_tolls = 0;
+  prop_location_tick = 0;
+
+  Vselection_alist = Qnil;
+  staticpro (&Vselection_alist);
+
+  DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist /*
+An alist associating selection-types (such as STRING and TIMESTAMP) with
+functions.  These functions will be called with three args: the name of the
+selection (typically PRIMARY, SECONDARY, or CLIPBOARD); a desired type to
+which the selection should be converted; and the local selection value
+ (whatever had been passed to `x-own-selection').  These functions should
+return the value to send to the X server, which should be one of:
+
+-- nil (the conversion could not be done)
+-- a cons of a symbol and any of the following values; the symbol
+   explicitly specifies the type that will be sent.
+-- a string (If the type is not specified, then if Mule support exists,
+             the string will be converted to Compound Text and sent in
+             the 'COMPOUND_TEXT format; otherwise (no Mule support),
+             the string will be left as-is and sent in the 'STRING
+             format.  If the type is specified, the string will be
+             left as-is (or converted to binary format under Mule).
+             In all cases, 8-bit data it sent.)
+-- a character (With Mule support, will be converted to Compound Text
+                whether or not a type is specified.  If a type is not
+                specified, a type of 'STRING or 'COMPOUND_TEXT will be
+               sent, as for strings.)
+-- the symbol 'NULL (Indicates that there is no meaningful return value.
+                     Empty 32-bit data with a type of 'NULL will be sent.)
+-- a symbol (Will be converted into an atom.  If the type is not specified,
+             a type of 'ATOM will be sent.)
+-- an integer (Will be converted into a 16-bit or 32-bit integer depending
+               on the value.  If the type is not specified, a type of
+              'INTEGER will be sent.)
+-- a cons (HIGH . LOW) of integers (Will be converted into a 32-bit integer.
+                                    If the type is not specified, a type of
+                                   'INTEGER will be sent.)
+-- a vector of symbols (Will be converted into a list of atoms.  If the type
+                        is not specified, a type of 'ATOM will be sent.)
+-- a vector of integers (Will be converted into a list of 16-bit integers.
+                         If the type is not specified, a type of 'INTEGER
+                        will be sent.)
+-- a vector of integers and/or conses (HIGH . LOW) of integers
+                        (Will be converted into a list of 16-bit integers.
+                         If the type is not specified, a type of 'INTEGER
+                        will be sent.)
+*/ );
+  Vselection_converter_alist = Qnil;
+
+  DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks /*
+A function or functions to be called after the X server has notified us
+that we have lost the selection.  The function(s) will be called with one
+argument, a symbol naming the selection (typically PRIMARY, SECONDARY, or
+CLIPBOARD).
+*/ );
+  Vx_lost_selection_hooks = Qunbound;
+
+  DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks /*
+A function or functions to be called after we have responded to some
+other client's request for the value of a selection that we own.  The
+function(s) will be called with four arguments:
+  - the name of the selection (typically PRIMARY, SECONDARY, or CLIPBOARD);
+  - the name of the selection-type which we were requested to convert the
+    selection into before sending (for example, STRING or LENGTH);
+  - and whether we successfully transmitted the selection.
+We might have failed (and declined the request) for any number of reasons,
+including being asked for a selection that we no longer own, or being asked
+to convert into a type that we don't know about or that is inappropriate.
+This hook doesn't let you change the behavior of emacs's selection replies,
+it merely informs you that they have happened.
+*/ );
+  Vx_sent_selection_hooks = Qunbound;
+
+  DEFVAR_INT ("x-selection-timeout", &x_selection_timeout /*
+If the selection owner doesn't reply in this many seconds, we give up.
+A value of 0 means wait as long as necessary.  This is initialized from the
+\"*selectionTimeout\" resource (which is expressed in milliseconds).
+*/ );
+  x_selection_timeout = 0;
+}
+
+void
+Xatoms_of_xselect (struct device *d)
+{
+  Display *D = DEVICE_X_DISPLAY (d);
+
+  /* Non-predefined atoms that we might end up using a lot */
+  DEVICE_XATOM_CLIPBOARD     (d) = XInternAtom (D, "CLIPBOARD",     False);
+  DEVICE_XATOM_TIMESTAMP     (d) = XInternAtom (D, "TIMESTAMP",     False);
+  DEVICE_XATOM_TEXT          (d) = XInternAtom (D, "TEXT",          False);
+  DEVICE_XATOM_DELETE        (d) = XInternAtom (D, "DELETE",        False);
+  DEVICE_XATOM_MULTIPLE      (d) = XInternAtom (D, "MULTIPLE",      False);
+  DEVICE_XATOM_INCR          (d) = XInternAtom (D, "INCR",          False);
+  DEVICE_XATOM_TARGETS       (d) = XInternAtom (D, "TARGETS",       False);
+  DEVICE_XATOM_NULL          (d) = XInternAtom (D, "NULL",          False);
+  DEVICE_XATOM_ATOM_PAIR     (d) = XInternAtom (D, "ATOM_PAIR",     False);
+  DEVICE_XATOM_COMPOUND_TEXT (d) = XInternAtom (D, "COMPOUND_TEXT", False);
+  DEVICE_XATOM_EMACS_TMP     (d) = XInternAtom (D, "_EMACS_TMP_",   False);
+}
diff --git a/tests/basic-lisp.el b/tests/basic-lisp.el
new file mode 100644 (file)
index 0000000..07a2676
--- /dev/null
@@ -0,0 +1,89 @@
+;;; Test basic Lisp functionality
+
+;;(when (not (boundp 'foo)) (setq foo 1))
+;;(incf foo)
+;;(print foo)
+
+(let ((my-vector [1 2 3 4])
+      (my-bit-vector (bit-vector 1 0 1 0))
+      (my-string "1234")
+      (my-list '(1 2 3 4)))
+
+  ;;(Assert (fooooo)) ;; Generate Other failure
+  ;;(Assert (eq 1 2)) ;; Generate Assertion failure
+  
+  (Assert (eq (elt my-vector 0) 1))
+  (Assert (eq (elt my-bit-vector 0) 1))
+  (Assert (eq (elt my-string 0) ?1))
+  (Assert (eq (elt my-list 0) 1))
+
+  (Assert (eq 4 (length my-vector)))
+  (Assert (eq 4 (length my-bit-vector)))
+  (Assert (eq 4 (length my-string)))
+
+  (fillarray my-vector 5)
+  (fillarray my-bit-vector 1)
+  (fillarray my-string ?5)
+
+  (Assert (eq 4 (length my-vector)))
+  (Assert (eq 4 (length my-bit-vector)))
+  (Assert (eq 4 (length my-string)))
+
+  (Assert (eq (elt my-vector 0) 5))
+  (Assert (eq (elt my-bit-vector 0) 1))
+  (Assert (eq (elt my-string 0) ?5))
+
+  (Assert (eq (elt my-vector 3) 5))
+  (Assert (eq (elt my-bit-vector 3) 1))
+  (Assert (eq (elt my-string 3) ?5))
+
+  (fillarray my-bit-vector 0)
+  (Assert (eq 4 (length my-bit-vector)))
+  (Assert (eq (elt my-bit-vector 2) 0))
+
+  ;; Test nconc
+  (let ((x (list 0 1 2)))
+    (Assert (eq (nconc) nil))
+    (Assert (eq (nconc nil) nil))
+    (Assert (eq (nconc nil x) x))
+    (Assert (eq (nconc x nil) x))
+    (let ((y (nconc x nil (list 3 4 5) nil)))
+      (Assert (eq (length y) 6))
+      (Assert (eq (nth 3 y) 3))
+      ))
+  )
+
+;;; Old cruft
+;;;(run-tests)
+
+;(defmacro Assert (assertion)
+;  `(condition-case error
+;       (progn
+;       (assert ,assertion)
+;       (princ (format "Assertion passed: %S" (quote ,assertion)))
+;       (terpri)
+;       (incf Assert-successes))
+;     (cl-assertion-failed
+;      (princ (format "Assertion failed: %S" (quote ,assertion)))
+;      (terpri)
+;      (incf Assert-failures))
+;     (t (princ (format "Test harness error: %S" error))
+;      (terpri)
+;      (incf Harness-failures)
+;      )))
+
+
+;(defun run-tests ()
+;  (with-output-to-temp-buffer "*Test-Log*"
+;    (let ((Assert-successes 0)
+;        (Assert-failures  0)
+;        (Harness-failures 0))
+;      (basic-lisp-test)
+;      (byte-compile 'basic-lisp-test)
+;      (basic-lisp-test)
+;      (print (format "%d successes, %d assertion failures, %d harness failures"
+;                   Assert-successes
+;                   Assert-failures
+;                   Harness-failures)))))
+
+;(defun the-test ()
diff --git a/tests/database.el b/tests/database.el
new file mode 100644 (file)
index 0000000..bc133df
--- /dev/null
@@ -0,0 +1,29 @@
+;;; Test database functionality
+
+(defun test-database (db)
+  (Assert (databasep db))
+  (put-database "key1" "val1" db)
+  (Assert (equal "val1" (get-database "key1" db)))
+  (remove-database "key1" db)
+  (Assert (equal nil (get-database "key1" db)))
+  (close-database db)
+  (Assert (not (database-live-p db)))
+  (Assert (databasep db))
+  (let ((filename (database-file-name db)))
+    (loop for fn in (list filename (concat filename ".db")) do
+      (when (file-exists-p fn)
+       (delete-file fn))))
+  )
+
+(let ((filename (expand-file-name "test-emacs" (temp-directory))))
+
+  (when (featurep 'dbm)
+  (let ((db (open-database filename 'dbm)))
+    (test-database db)))
+  
+  (princ "\n")
+
+  (when (featurep 'berkeley-db)
+    (let ((db (open-database filename 'berkeley-db)))
+      (test-database db)))
+  )
diff --git a/tests/test-emacs.el b/tests/test-emacs.el
new file mode 100644 (file)
index 0000000..bd34433
--- /dev/null
@@ -0,0 +1,219 @@
+;; test-emacs.el --- Run Emacs Lisp test suites.
+
+;;; Copyright (C) 1998 Free Software Foundation, Inc.
+
+;; Author: Martin Buchholz
+;; Keywords: testing
+
+;; This file is part of XEmacs.
+
+;; XEmacs 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.
+
+;; XEmacs 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 XEmacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with: Not in FSF
+
+(defvar test-emacs-verbose
+  (and (not noninteractive) (> (device-baud-rate) search-slow-speed))
+  "*Non-nil means print messages describing progress of emacs-tester.")
+
+(defvar test-emacs-current-file nil)
+
+(defvar emacs-lisp-file-regexp (purecopy "\\.el$")
+  "*Regexp which matches Emacs Lisp source files.")
+
+(defun test-emacs-test-file (filename)
+  "Test a file of Lisp code named FILENAME.
+The output file's name is made by appending `c' to the end of FILENAME."
+  ;;  (interactive "fTest file: ")
+  (interactive
+   (let ((file buffer-file-name)
+        (file-name nil)
+        (file-dir nil))
+     (and file
+         (eq (cdr (assq 'major-mode (buffer-local-variables)))
+             'emacs-lisp-mode)
+         (setq file-name (file-name-nondirectory file)
+               file-dir (file-name-directory file)))
+     (list (read-file-name "Test file: " file-dir nil nil file-name))))
+  ;; Expand now so we get the current buffer's defaults
+  (setq filename (expand-file-name filename))
+
+  ;; If we're testing a file that's in a buffer and is modified, offer
+  ;; to save it first.
+  (or noninteractive
+      (let ((b (get-file-buffer (expand-file-name filename))))
+       (if (and b (buffer-modified-p b)
+                (y-or-n-p (format "save buffer %s first? " (buffer-name b))))
+           (save-excursion (set-buffer b) (save-buffer)))))
+
+  (if (or noninteractive test-emacs-verbose)
+      (message "Testing %s..." filename))
+  (let ((test-emacs-current-file filename)
+       input-buffer)
+    (save-excursion
+      (setq input-buffer (get-buffer-create " *Test Input*"))
+      (set-buffer input-buffer)
+      (erase-buffer)
+      (insert-file-contents filename)
+      ;; Run hooks including the uncompression hook.
+      ;; If they change the file name, then change it for the output also.
+      (let ((buffer-file-name filename)
+           (default-major-mode 'emacs-lisp-mode)
+           (enable-local-eval nil))
+        (normal-mode)
+        (setq filename buffer-file-name)))
+    (test-emacs-from-buffer input-buffer filename)
+    (kill-buffer input-buffer)
+    ))
+
+(defun test-emacs-read-from-buffer (buffer)
+  "Read forms from BUFFER, and turn it into a lambda test form."
+  (let ((body nil))
+    (goto-char (point-min) buffer)
+    (condition-case nil
+       (while t
+         (setq body (cons (read inbuffer) body)))
+      (error nil))
+    `(lambda ()
+       (defvar passes)
+       (defvar assertion-failures)
+       (defvar other-failures)
+       ,@(nreverse body))))
+
+(defun test-emacs-from-buffer (inbuffer filename)
+  "Run tests in buffer INBUFFER, visiting FILENAME."
+  (let ((passes 0)
+       (assertion-failures 0)
+       (other-failures 0))
+    (with-output-to-temp-buffer "*Test-Log*"
+      (defmacro Assert (assertion)
+       `(condition-case error
+            (progn
+              (assert ,assertion)
+              (princ (format "PASS: %S" (quote ,assertion)))
+              (terpri)
+              (incf passes))
+          (cl-assertion-failed
+           (princ (format "Assertion failed: %S" (quote ,assertion)))
+           (terpri)
+           (incf assertion-failures))
+          (t (princ "Error during test execution:\n\t")
+             (display-error error nil)
+             (terpri)
+             (incf other-failures)
+             )))
+
+      (princ "Testing Interpreted Lisp\n\n")
+      (funcall (test-emacs-read-from-buffer inbuffer))
+      (princ "\nTesting Compiled Lisp\n\n")
+      (funcall (byte-compile (test-emacs-read-from-buffer inbuffer)))
+      (princ (format
+             "\nSUMMARY: %d passes, %d assertion failures, %d other failures\n"
+             passes
+             assertion-failures
+             other-failures))
+      (let* ((total (+ passes assertion-failures other-failures))
+            (basename (file-name-nondirectory filename))
+            (summary-msg
+             (if (> total 0)
+                 (format "%s: %d of %d (%d%%) tests successful."
+                         basename passes total (/ (* 100 passes) total))
+               (format "%s: No tests run" basename))))
+       (message "%s" summary-msg))
+      (fmakunbound 'Assert))))
+
+(defvar test-emacs-results-point-max nil)
+(defmacro displaying-emacs-test-results (&rest body)
+  `(let ((test-emacs-results-point-max test-emacs-results-point-max))
+     ;; Log the file name.
+     (test-emacs-log-file)
+     ;; Record how much is logged now.
+     ;; We will display the log buffer if anything more is logged
+     ;; before the end of BODY.
+     (or test-emacs-results-point-max
+        (save-excursion
+          (set-buffer (get-buffer-create "*Test-Log*"))
+          (setq test-emacs-results-point-max (point-max))))
+     (unwind-protect
+        (condition-case error-info
+            (progn ,@body)
+          (error
+           (test-emacs-report-error error-info)))
+       (save-excursion
+        ;; If there were compilation warnings, display them.
+        (set-buffer "*Test-Log*")
+        (if (= test-emacs-results-point-max (point-max))
+            nil
+          (if temp-buffer-show-function
+              (let ((show-buffer (get-buffer-create "*Test-Log-Show*")))
+                (save-excursion
+                  (set-buffer show-buffer)
+                  (setq buffer-read-only nil)
+                  (erase-buffer))
+                (copy-to-buffer show-buffer
+                                (save-excursion
+                                  (goto-char test-emacs-results-point-max)
+                                  (forward-line -1)
+                                  (point))
+                                (point-max))
+                (funcall temp-buffer-show-function show-buffer))
+              (select-window
+               (prog1 (selected-window)
+                 (select-window (display-buffer (current-buffer)))
+                 (goto-char test-emacs-results-point-max)
+                 (recenter 1)))))))))
+
+(defun batch-test-emacs-1 (file)
+  (condition-case err
+      (progn (test-emacs-test-file file) t)
+    (error
+     (princ ">>Error occurred processing ")
+     (princ file)
+     (princ ": ")
+     (display-error err nil)
+     (terpri)
+     nil)))
+
+(defun batch-test-emacs ()
+  "Run `test-emacs' on the files remaining on the command line.
+Use this from the command line, with `-batch';
+it won't work in an interactive Emacs.
+Each file is processed even if an error occurred previously.
+For example, invoke \"xemacs -batch -f batch-test-emacs tests/*.el\""
+  ;; command-line-args-left is what is left of the command line (from
+  ;; startup.el)
+  (defvar command-line-args-left)      ;Avoid 'free variable' warning
+  (if (not noninteractive)
+      (error "`batch-test-emacs' is to be used only with -batch"))
+  (let ((error nil)
+       (debug-issue-ebola-notices 0))
+    (loop for file in command-line-args-left
+      do
+      (if (file-directory-p (expand-file-name file))
+         (let ((files (directory-files file))
+               source)
+           (while files
+             (if (and (string-match emacs-lisp-file-regexp (car files))
+                      (not (auto-save-file-name-p (car files)))
+                      (setq source (expand-file-name
+                                    (car files)
+                                    file))
+                      (if (null (batch-test-emacs-1 source))
+                          (setq error t)))
+                 (setq files (cdr files)))))
+       (if (null (batch-test-emacs-1 file))
+           (setq error t))))
+    (message "Done")
+    (kill-emacs (if error 1 0))))